使用ZF2中的WHERE和JOIN进行更新


Update with WHERE and JOIN in ZF2

我正在尝试在Zend Framework 2中更新MySQL数据库中的一个值。我想在表格中使用where和Join。表格结构为

-----Credit-----
   ContactID
     Credits
-----Token------
   ContactID
    Token

我想写下面的MYSQL查询

"Update credit_details 
     LEFT JOIN token ON token.CONTACT_ID = credit.CONTACT_ID 
 SET CREDITS = '200' 
 WHERE TOKEN ='$token';".

到目前为止,我有以下代码,但它似乎不起作用。

$this->tableGateway->update(function (Update $update) use ($token){
        $update->set(array('CREDITS'=>$credits))
        ->join('token','token.CONTACT_ID=credit.CONTACT_ID', array( 'CONTACT_ID'=>'CONTACT_ID'
        ),'left')
        ->where($this->tableGateway->getAdapter()->getPlatform()->quoteIdentifierChain(array('token_details','TOKEN')) . ' = ' . $this->tableGateway->getAdapter()->getPlatform()->quoteValue($token));
    });

给出一些澄清。对于带有JOIN的UPDATE,没有一个抽象层。Zend-UpdateDBAL没有可调用的联接方法。

参考:Zend''Db''Sql''Update

为了使用ZF2的表网关执行带有联接的更新,您需要扩展表网关并编写自己的updateJoin方法,或者扩展Sql''update对象(如updateJoin)并添加联接方法。

为了在不扩展ZF2对象的情况下使用tableGateway更新join,您需要执行以下操作

参考:ZF2文档

<?php
/* Define a token for the example */
$token = 12345;
/* create a new statement object with the current adapter */
$statement = $this->tableGateway->getAdapter()
    ->createStatement(
        'UPDATE credit_details
        LEFT JOIN token
        ON token.CONTACT_ID = credit_details.CONTACT_ID
        SET credit_details.CREDITS = 100
        WHERE token.TOKEN = ?' 
    );
/* create a new resultset object to retrieve results */
$resultSet = new Zend'Db'ResultSet'ResultSet;
/* execute our statement with the token and load our resultset */
$resultSet->initialize( $statement->execute( array( $token ) ) );
/* display the affected rows */
echo $resultSet->count();

离题

同时提供一些建议,可能会在未来为您省去一些麻烦。当使用ZF2DAL并且指定了适配器和驱动程序时,驱动程序将为您处理引号标识符和值。除非您特别使用Zend''Db''Sql''Expression或Zend''Db ''Sql''Literal来处理引号标识符和值。在大多数情况下,您可以在where调用中使用Zend''Db''Sql''Precdicate''Precdicate,这是我喜欢的方法。

参考:Zend''Db''Sql文档

例如:

<?php
$adapter = new Zend'Db'Adapter'Adapter($configArray);
$sql = new Zend'Db'Sql'Sql($adapter);
$update = $sql->update( 'credit_details');
$update->set( array('CREDITS' => $credits) );
$update->where( array( 'CONTACT_ID' => $contact_id ) );