获取在Symfony3存储库中创建的MongoDB文档的ID

时间:2016-11-14 15:07:51

标签: php mongodb doctrine-orm symfony doctrine-odm

在我的 Symfony3 项目中,我确实有一些文档,例如用户,如下所述:

UserBundle\Document\User:
    repositoryClass: UserBundle\Repository\UserRepository
    fields:
        userId:
            id: true
        email:
            type: string
        firstName:
            type: string
        lastName:
            type: string

有一段时间,我想通过用户存储库创建用户文档。 围绕 createQueryBuilder(),我构建了这个方法:

public function insert($email, $firstName, $lastName)
{
    $data = array('email' => $email,
        'firstName' => $firstName,
        'lastName' => $lastName,
    );

    /* Create query */

    $query = $this->createQueryBuilder();

    /* Add Data */

    $query
        ->insert()
        ->setNewObj($data);

    /* Return */

    $query
        ->getQuery()
        ->execute();

    return true;
}

我想返回我刚刚创建的文档的ID ,而不是返回true

寻找答案,我找到了这段代码:

$this->getDocumentManager()->getConnection()->lastInsertId

不幸的是,它没有归还我想要的东西:

object(MongoDB)[307]
  public 'w' => int 1
  public 'wtimeout' => int 10000

感谢您的帮助!

编辑:

这是一个更新的代码,其中包含在接受的答案中提出的建议:

public function insert($email, $firstName, $lastName)
{
    $id = new MongoId();

    $data = array(
        '_id' => $id,
        'email' => $email,
        'firstName' => $firstName,
        'lastName' => $lastName,
    );

    /* Create query */

    $query = $this->createQueryBuilder();

    /* Add Data */

    $query
        ->insert()
        ->setNewObj($data);

    /* Return */

    $query
        ->getQuery()
        ->execute();

    return $id->__toString();
}

2 个答案:

答案 0 :(得分:1)

解决问题的最简单方法是通过调用new \MongoId()生成标识符,将其添加到您要插入的数据(在_id键下)并返回已知值。当你在没有明确设置标识符的情况下插入文档时,这正是幕后的MongoDB驱动程序所做的事情(参见this doc example

答案 1 :(得分:0)

MongoDB驱动程序将ID写入正在传入的数组中,但由于查询对象的结构,您没有看到它。您可以从getQuery()

返回的查询对象中获取它
$query = $queryBuider->getQuery();
$query->execute();

$id = $query->getQuery['newObj']['_id'];

但请注意,这不一定适用于将来的版本,因为新的MongoDB驱动程序(将从ODM 2.0开始使用)不具备此功能。