РЕДАКТИРОВАТЬ: Этот заголовок вопроса первоначально был: Как Doctrine знает последний вставленный id в MySQL? и был связан с Mapper Doctrine ORM. После некоторого копания я узнал, что этот вопрос не связан с Doctrine, а с PDO_MySQL, MySQL C API и, наконец, - с обменом данными между клиентом и сервером MySQL. Я решил изменить название, так что, возможно, кто-то найдет ответ на его/ее вопрос.
Для тех, кто не использует Доктрину: мне было любопытно, почему рев:
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()
) в log:
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? В журналах больше ничего нет.