Средство построения запросов lastInsertId()

#typo3 #query-builder #extbase #typo3-9.x

#typo3 #конструктор запросов #extbase #typo3-9.x

Вопрос:

Я хотел бы иметь последний идентификатор записи. Для mysql это «insertId()». Как это работает в Extbase?

 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
$queryBuilder
   ->insert($table)
   ->values([
       'test_id'          => 1,
       'test2_id'         => 2,
   ]);

$queryBuilder->execute();

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table2);
$queryBuilder
   ->insert($table2)
   ->values([
       'uid_local'         => ?, // uid from $table
       'uid_foreign'       => 1
   ]);
$queryBuilder->execute();
  

Ответ №1:

Вы можете получить идентификатор последней вставки с помощью $queryBuilder->getConnection()->lastInsertId();

Так что это сделало бы это:

 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
$queryBuilder
   ->insert($table)
   ->values([
       'test_id'          => 1,
       'test2_id'         => 2,
   ]);

$queryBuilder->execute();
$tableUid = $queryBuilder->getConnection()->lastInsertId();

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table2);
$queryBuilder
   ->insert($table2)
   ->values([
       'uid_local'         => $tableUid,
       'uid_foreign'       => 1
   ]);
$queryBuilder->execute();
  

Комментарии:

1. Нет, вам нужен первый $QueryBuilder. Если вы используете этот код на месте вопросительного знака, вы будете использовать $QueryBuilder для table2. Поэтому либо переименуйте первый $QueryBuilder, либо поместите выходные данные $queryBuilder->getConnection()->lastInsertId(); в переменную, прежде чем заменять $QueryBuilder, и замените знак вопроса на эту переменную. Я добавил пример второго варианта (с переменной) к своему первоначальному ответу.

Ответ №2:

Я немного не уверен, доступен ли он при использовании QueryBuilder для вставки новых записей, но руководство по миграции в документах TYPO3 объясняет, как перенести метод sql_insert_id() в новый уровень базы данных Doctrine

https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Database/Migration/Index.html#sql-insert-id

Подсказка:

(int)$databaseConnectionForPages->lastInsertId('pages');