编辑:这个问题的标题最初是:Doctrine 如何知道 MySQL 中最后插入的 id?并且与Doctrine 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)
我创建了新的类别对象和产品对象。我将类别对象分配给产品对象。我没有设置任何ID:
$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 怎么知道新创建的类别 id 是 312?日志中没有其他内容。