Doctrine2插入并检索新的插入ID

时间:2011-08-24 09:07:04

标签: php doctrine-orm

在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 个答案:

答案 0 :(得分:112)

如果您使用的是ORM

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

如果您使用的是DBAL:

$conn->lastInsertId();

http://www.doctrine-project.org/api/dbal/2.5/class-Doctrine.DBAL.Connection.html#_lastInsertId

答案 1 :(得分:5)

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

它可以与本机查询以及手动编写的插入一起使用。

示例案例:

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

var_dump($connection->lastInsertId());

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

$connection = $em->getConnection();

注意:
除了技术细节,我同意@Layke为您的具体案例使用实体。

答案 2 :(得分:1)

提供您尝试设置的实体

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

然后,当您持久保存对象时,实体管理器将填充您尝试使用ID保留的实体。

然而,有些警告显示,你无法使用复合键明显地执行此操作,并且您显然必须刷新所有实体。因此,如果您将与您正在尝试获取ID的持久实体关联的实体分离,则您将无法检索该ID。

除此之外,Flask的答案还在继续。

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

答案 3 :(得分:0)

仅使用Doctrine的DBAL(无ORM)时,

$conn->lastInsertId();将为您提供最后插入的ID。