使用学说 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?
laravel 8:插入方法在 eloquent 中获取最后一个插入 id(插入方法)