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値を取得する可能性がないことを教えてください!?
これが私が使うものです:
$data = array()// Your data to be saved;
$this->tableGateway->insert($data);
$id = $this->tableGateway->lastInsertValue;
これはしばらく前のことですが、この特定の問題に長い時間を費やした後、同じ問題を経験している将来の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");
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();
が機能するはずです。
わかりました。質問は数か月前のものですが、この問題の解決策を探している人にとって、最後の挿入値を取得するのが役立つ場合があります。アダプタインターフェイスから値を取得するのが最善の方法です。
do your insert //then
$id = $adapter->getDriver()->getLastGeneratedValue();
これは私にとってmysqlデータベースでうまくいきました
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');
}
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')
これはまだ実装されていないため、Oracle oci8では機能しません。ここを参照してください: https://github.com/zendframework/zf2/blob/master/library/Zend/Db/Adapter/Driver/Oci8/Connection.php#L34