使用学说 2 获取最后一个插入 id?

Posted

技术标签:

【中文标题】使用学说 2 获取最后一个插入 id?【英文标题】:Get the last insert id with doctrine 2? 【发布时间】:2011-03-31 09:01:33 【问题描述】:

如何使用学说 2 ORM 获取最后一个插入 ID?我在教义文档中没有找到这个,这甚至可能吗?

【问题讨论】:

试试这个,在插入结束时返回 id... 比如 return $this->id; 【参考方案1】:

在我的例子中,当我将 $id 声明为私有时,我刚刚创建了一个新的公共方法来获取它。

public function getId() 
 return $this->id;

那么我可以这样称呼它

    $user = new User();
    $user->setUsername("Kylo Ren");
    $entityManager = getEntityManager();
    $entityManager->persist($user);
    $entityManager->flush();
    echo "Created User with ID " . $user->getId() . "\n";

【讨论】:

【参考方案2】:

调用实体管理器的persist和flush方法后即可访问id。

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

必须调用flush来获取这个id。

【讨论】:

【参考方案3】:

更简单:SELECT max(id) FROM client

【讨论】:

对于并发和大型系统来说不是一个好主意。【参考方案4】:

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

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

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;
    

【讨论】:

【参考方案5】:

如果您不使用实体,而是使用 Native SQL,如 here 所示,那么您可能希望获取最后插入的 id,如下所示:

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

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

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

有关更多信息,请查看 GitHub here 和 here 上的代码。

【讨论】:

这可能不适用于每个 DBMS。例如它不适用于 Postgres(因为序列) 太棒了!我花了几个小时寻找这个小sn-p。 @paul.ago 你只需要知道序列的名称,例如:lastInsertId('articles_id_seq') 你也可以像这样获取序列的名称:$conn = $this->getDoctrine()->getConnection();$metadata = $em->getClassMetadata('\App\Entity\YourClass');$seqName = $metadata->getSequenceName($conn->getDatabasePlatform()); Works :-)【参考方案6】:

回答这个问题有点晚了。但是,

如果是 mysql 数据库

如果AUTO_INCREMENT 在数据库和表定义中定义,$doctrine_record_object->id 应该工作。

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

我必须在刷新后使用它来获取最后一个插入 ID:

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

【讨论】:

不能用。获取错误调用“我的项目”中未定义的方法 Test\Entity\Test::getId() @noobie-php 您需要为您的 Id 定义一个公共 getter(如果这个应该是私有的) @cheesemacfly:我已经解决了这个错误(在我的场景中)当我们出于任何原因无法刷新()时,一旦 Flush()成功执行 getID()开始工作,假设 getter 和 setter 在这里不是问题 如果我 persist() 循环中的实体和之后的 flush() 怎么办?我正在努力解决这个问题,但到目前为止还没有运气。 将 id 分配给变量:code $id = $user->getId(); code

以上是关于使用学说 2 获取最后一个插入 id?的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 2 - 如何在 PostPersist 中获取最后插入的 id 的 ID?

使用 PDO 准备好插入后获取最后一个插入 ID

如何从表中获取最后一个插入 ID

laravel 8:插入方法在 eloquent 中获取最后一个插入 id(插入方法)

Symfony Query Builder 如何获取最后分组的记录

lastInsertId() 是不是获取该脚本或整体插入的最后一个 id?