#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
Подсказка:
(int)$databaseConnectionForPages->lastInsertId('pages');