РЕДАКТИРОВАТЬ: Первоначально заголовок этого вопроса был: Как Doctrine узнает последний вставленный идентификатор в MySQL? и был связан с Доктрина ORM mapper. Покопавшись, я обнаружил, что этот вопрос не относится к Doctrine , а к PDO_MySQL , MySQL C API и, наконец, к обмену данными клиент-сервер MySQL. Я решил изменить название, так что, возможно, кто-то найдет ответ на свой вопрос.
Для тех, кто не использует Doctrine: Мне было любопытно, почему ниже:
mysql_query("INSERT INTO category (name) VALUES('cat')");
echo mysql_insert_id();
или подобное:
$pdo->exec("INSERT INTO category (name) VALUES('cat')");
echo $pdo->lastInsertId();
приведет к только одной позиции (без отдельного SELECT LAST_INSERT_ID ()
) в журнале:
1701 Query INSERT INTO category (name) VALUES ('cat')
Исходный вопрос:
У меня есть 2 таблицы:
category(id,name)
product(id, name, categoryId)
Я создал новый объект категории и продукт объект. Я назначил объект категории объекту продукта. Я не устанавливал никаких идентификаторов:
$product = new Product();
$product->name = 'asdf';
$category = new Category();
$category->name = 'cat';
$product->Category = $category;
После этого я сбросил соединение и проверил журналы MySQL:
1684 Query START TRANSACTION
1684 Query INSERT INTO category (name) VALUES ('cat')
1684 Query INSERT INTO product (name, categoryid) VALUES ('asdf', '312')
1684 Query COMMIT
Как Doctrine узнала, что новый идентификатор категории - 312? В журналах больше ничего нет.