ZF2 Как получить последнее значение идентификатора вставки?

Я застрял в получении последнего идентификатора вставки с Zend framework 2, и я отказался от этого...

Происходят комбинации:

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. Пожалуйста, не говорите мне, что такая большая структура не дает возможности получить последнее значение идентификатора вставки!?

Ответы

Ответ 1

Вот что я использую:

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

Ответ 2

Я знаю, что это было давно, но, потратив много времени на эту конкретную проблему, я хотел опубликовать решение для будущих Googlers, испытывающих ту же проблему.

Проблема заключается в том, что драйвер Pgsql требует, чтобы имя последовательности возвращало последний id следующим образом:

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

Это работает в 2.3.1. В 2.2.2 (и, возможно, позже) была ошибка, в которой имя не было параметром getLastGeneratedValue в драйвере, поэтому вам нужно было бы напрямую вызвать соединение.

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

Итак, что я нашел, просмотрев код. Лучшее решение - убедиться, что у вас ZF2 обновлен, и используйте

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

Ответ 3

В 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

Хорошо, я знаю, что вопрос несколько месяцев, хотя может быть полезно для тех, кто ищет решение этой проблемы, чтобы получить последние значения вставки, лучший способ - получить значение из интерфейса адаптера

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

Это сработало для меня для базы данных mysql

Ответ 5

В App\Model\AlbumTable, который продолжается AbstractTableGateway, я получаю последний id $inserted_id = $this->lastInsertValue;

в качестве примера:

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

Ответ 7

Есть еще одна возможность добавить FeatureSet в 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')