Doctrine2插入和检索新的插入ID

51
在Doctrine2中,使用类似以下的语句:
$user = array('username' => 'example', 'passsword' => 'changeme');

$conn->insert('users', $user);

我刚刚插入了一个用户,那么如何获取该用户的最后一个ID呢?如果无法实现此操作,则如何生成一个ID以便您可以执行以下操作:

$id = //something here.
$user = array('username' => 'example', 'passsword' => 'changeme', 'id' => $id);
$conn->insert('users', $user);
4个回答

130

他没有持久化一个对象,而是插入了一个数组。 - Matthieu Napoli
12
对于ORM和DBAL的区别进行明确区分,并为两者都回答问题,加2分。(翻译): 需要对ORM和DBAL进行明确的区分,并对两者进行回答。 - Frug

11

可以使用Doctrine\DBAL\Connection::lastInsertId()方法。

它既可以与本地查询一起使用,也可以与手动编写的插入语句一起使用。

示例:

$query = 'INSERT INTO blabla...';
$connection->executeUpdate($query, $params);

var_dump($connection->lastInsertId());

如果使用ORM,您可以从实体管理器获取连接的实例:

$connection = $em->getConnection();

注意:
除了技术细节外,我同意@Layke的建议,在您的特定情况下使用实体。


1

假设您要设置的实体具有

   /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     */
    private $id;

当你持久化对象时,实体管理器将使用ID填充你尝试持久化的实体。

然而,有一些注意事项,显然不能使用复合键进行此操作,而且你必须刷新所有实体。因此,如果你分离了一个具有与你尝试获取ID的持久化实体相关联的关联实体,那么你将无法检索到ID。

除此之外,Flask的答案是正确的。

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

1

$conn->lastInsertId();将在仅使用Doctrine的DBAL(不包括ORM)时获得最后插入的ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接