获取带有准则2的最后一个插入ID?


76

我如何获得带有准则2 ORM的最后一个插入ID?我在学说的文档中没有找到,这甚至可能吗?


试试看,在插入的末尾返回id ...就像return $ this-> id;
马尼

Answers:


178

我必须在刷新后使用此函数来获取最后的插入ID:

$em->persist($user);
$em->flush();
$user->getId();

2
不能使用它。获取错误调用“我的项目”中未定义的方法Test \ Entity \ Test :: getId()
noobie-php 2013年

@ noobie-php您需要为您的ID定义一个公共获取器(如果这个是应该的,则应该是私有的)
cheesemacfly 2013年

@cheesemacfly:我已经解决了这个问题(在我的情况下),当由于某种原因我们无法进行flush()时,一旦成功执行Flush(),getID()就开始起作用,并且假设getter和setter都没有问题,就会生成此错误在这里
noobie-php

1
如果我persist()将实体循环,flush()之后又该怎么办?我正在设法弄清楚,但到目前为止还没有运气。
Nat Naydenova 2015年

为变量分配ID:code$ id = $ user-> getId(); code
约西亚

40

您可以在调用实体管理器的persist方法之后访问该id。

$widgetEntity = new WidgetEntity();
$entityManager->persist($widgetEntity);
$entityManager->flush();
$widgetEntity->getId();

确实需要刷新才能获取此ID。

语法错误修复:在调用$ entityManager-> flush()之后添加了分号。


6
我确实需要冲洗才能收回价值。持久性还不够,因为在刷新之前,这些项目实际上并未写入数据库。
杰里米·希克斯

29

如果您不使用实体,而是使用Native SQL(如此处所示)则可能需要获取最后插入的id,如下所示:

$entityManager->getConnection()->lastInsertId()

对于具有序列的数据库(例如PostgreSQL),请注意,您可以提供序列名称作为方法的第一个参数lastInsertId

$entityManager->getConnection()->lastInsertId($seqName = 'my_sequence')

有关更多信息,请在此处此处查看GitHub上的代码。


这可能不适用于每个DBMS。例如,它不适用于Postgres(由于序列)
paul.ago

太棒了!! 我花了几个小时寻找这个小片段。
MikeGA 2015年

4
@ paul.ago您只需要知道序列的名称即可,例如:lastInsertId('articles_id_seq')
ChocoDeveloper

1
您还可以像这样获得序列的名称:$conn = $this->getDoctrine()->getConnection(); $metadata = $em->getClassMetadata('\App\Entity\YourClass'); $seqName = $metadata->getSequenceName($conn->getDatabasePlatform());Works :-)
Hugues D

10

调用flush()可能会添加许多新实体,因此实际上并没有“ lastInsertId”的概念。但是,Doctrine将在每次生成身份字段时填充身份字段,因此在调用flush之后访问id字段将始终包含新的“持久”实体的ID。


2

回答问题有点晚了。但,

如果是MySQL数据库

$doctrine_record_object->id如果AUTO_INCREMENT在数据库和表定义中定义,则应该可以使用。


0

在我将自己推了一个工作日以找到此解决方案之后,我在这里发布了代码。

获取最后保存的记录的功能:

private function getLastId($query) {
        $conn = $this->getDoctrine()->getConnection();
        $stmt = $conn->prepare($query);
        $stmt->execute();
        $lastId = $stmt->fetch()['id'];
        return $lastId;
    }

另一个调用上述函数的函数

private function clientNum() {
        $lastId = $this->getLastId("SELECT id FROM client ORDER BY id DESC LIMIT 1");
        $noClient = 'C' . sprintf("%06d", $lastId + 1); // C000002 if the last record ID is 1
        return $noClient;
    }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.