81

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

4

8 回答 8

184

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

$em->persist($user);
$em->flush();
$user->getId();
于 2010-08-18T08:34:18.497 回答
43

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

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

必须调用 flush 才能获得此 ID。

于 2010-08-20T10:03:10.913 回答
30

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

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

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

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

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

于 2014-11-10T16:24:36.833 回答
10

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

于 2010-08-19T12:23:22.263 回答
2

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

如果是 MySQL 数据库

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

于 2010-12-15T12:53:13.983 回答
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";
于 2021-08-22T14:50:08.783 回答
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;
    }
于 2019-11-15T15:24:18.460 回答
0

更简单:SELECT max(id) FROM client

于 2020-05-05T15:05:20.907 回答