0

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));
    });
4

1 に答える 1

0

明確にするために。JOIN を使用した UPDATE の抽象化レイヤーはありません。Zend Update DBAL には、呼び出す join メソッドがありません。

参照: Zend\Db\Sql\Update

ZF2 のテーブル ゲートウェイを使用して結合で更新を実行するには、テーブル ゲートウェイを拡張して独自の updateJoin メソッドを記述するか、Sql\Update オブジェクトを UpdateJoin として拡張し、結合メソッドを追加する必要があります。

tableGateway を使用して、ZF2 オブジェクトを拡張せずに 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();

オフトピック

また、将来の手間を省くためのアドバイスも提供します。ZF2 DBAL を使用していて、アダプターとドライバーが指定されている場合、ドライバーは引用符の識別子と値を処理します。Zend\Db\Sql\Expression または Zend\Db\Sql\Literal を使用して、引用符の識別子と値を処理する必要がある場合を除きます。ほとんどの場合、Zend\Db\Sql\Predicate\Predicate を where 呼び出しで使用できます。これは私の好みの方法です。

参照: 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 ) );
于 2014-02-19T21:27:29.620 に答える