web-dev-qa-db-ja.com

ZF2最後の挿入ID値を取得する方法?

Zendフレームワーク2で最後の挿入IDを取得することに行き詰まり、これをあきらめました...

試みられた組み合わせがあります:

var_dump($this->tableGateway->insert($insert));
var_dump($this->tableGateway->lastInsertValue);
var_dump($this->tableGateway->getLastInsertValue());
var_dump($this->tableGateway->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue());

値はテーブルに挿入されていますが、すべての行(最初を除き、int "1"を与える)はnullを返します。そのような大きなフレームワークは、最後の挿入ID値を取得する可能性がないことを教えてください!?

17
Piotr

これが私が使うものです:

$data = array()// Your data to be saved;
$this->tableGateway->insert($data);
$id = $this->tableGateway->lastInsertValue;
28
Jean Paul

これはしばらく前のことですが、この特定の問題に長い時間を費やした後、同じ問題を経験している将来のGoogle社員のために解決策を投稿したいと思いました。

問題は、Pgsqlドライバーが次のように最後のIDを返すためにシーケンスの名前を必要とすることです。

$adapter->getDriver()->getLastGeneratedValue("sequence_name");

これは2.3.1で機能します。ドライバーのgetLastGeneratedValueのパラメーターではない名前が2.2.2(およびそれ以降)にあるバグがあったため、接続を直接呼び出す必要があります。

$adapter->getDriver()->getConnection()->getLastGeneratedValue

それで、コードを調べたところそれがわかりました。最善の解決策は、ZF2が更新されていることを確認し、

$adapter->getDriver()->getLastGeneratedValue("sequence_name");
8
skymander

Postgresでは、SequenceFeatureのセットアップが必要です。

_...
use Zend\Db\TableGateway\Feature;
...
public function setDbAdapter( Adapter $adapter ) {
   ...
   $this->featureSet = new Feature\FeatureSet();
   $this->featureSet->addFeature(new Feature\SequenceFeature('YOUR_FIELD_NAME','YOUR_SEQUENCE_NAME'));
   $this->initialize();
}
_

これで$this->tableGateway->getLastInsertValue();が機能するはずです。

4
Subey

わかりました。質問は数か月前のものですが、この問題の解決策を探している人にとって、最後の挿入値を取得するのが役立つ場合があります。アダプタインターフェイスから値を取得するのが最善の方法です。

do your insert //then
$id = $adapter->getDriver()->getLastGeneratedValue();

これは私にとってmysqlデータベースでうまくいきました

3
Raj

AbstractTableGatewayを拡張するApp\Model\AlbumTableでは、$inserted_id = $this->lastInsertValue;によって最後のIDを取得します

例として:

 if ($id == 0) {
            $this->insert($data);
            $inserted_id = $this->lastInsertValue;    
        } elseif ($this->getAlbum($id)) {
            $this->update(
                $data, array(
                'id' => $id,
                )
            );
        } else {
            throw new \Exception('Form id does not exist');
        }
1
Aurimas

FeatureGateをTableGatewayに追加する別の可能性があります。

Module.phpで定義できます(たとえば、テーブルユーザー)

            'UserTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new UserEntity());
                return new TableGateway('user', $dbAdapter, new Feature\SequenceFeature('user','user_id_seq'), $resultSetPrototype);

ただし、SequenceFeatureにはバグがあります。パブリックスキーマを使用する場合は、すべて問題ありません。他のスキーマを使用する必要がある場合は、Zend\Db\Sql\TableIdentifierを使用する必要があります。

この場合、Module.phpは次のようになります。

            'UserTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new UserEntity());
                return new TableGateway(new TableIdentifier('user','someSchema'), $dbAdapter, new Feature\SequenceFeature(new TableIdentifier('user','someSchema'),'user_id_seq'), $resultSetPrototype);

この場合、PostgresqlクエリのSELECT NEXTVALでエラーが発生します。これは、Feature\SequenceFeatureがクエリを準備するために最初の引数で定義されるのではなく、パブリックスキーマを使用するためです。

SELECT NEXTVAL( 'user_id_seq')

この場合、SQLクエリは

SELECT NEXTVAL( 'someSchema'。 'user_id_seq')

0

これはまだ実装されていないため、Oracle oci8では機能しません。ここを参照してください: https://github.com/zendframework/zf2/blob/master/library/Zend/Db/Adapter/Driver/Oci8/Connection.php#L34

0
Name