获取在 Symfony3 存储库中创建的 MongoDB 文档的 ID
Get id of the MongoDB document created in a Symfony3 repository
在我的 Symfony3 项目中,我确实有一些文档,例如 User,如下所述:
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;
}
而不是 returning true
,我想 return 我刚刚创建的文档的 ID.
寻找答案,我找到了这段代码:
$this->getDocumentManager()->getConnection()->lastInsertId
不幸的是,return不是我要找的东西:
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();
}
解决问题的最简单方法是通过调用 new \MongoId()
预先生成标识符,将其添加到您要插入的数据(在 _id
键下)并且 return 已知价值。此外,当您插入未明确设置标识符的文档时,这正是底层 MongoDB 驱动程序在幕后所做的(参见 this doc example)
MongoDB 驱动程序将 ID 写入传入的数组中,但由于查询对象的结构,您看不到它。您可以从 getQuery()
:
返回的查询对象中获取它
$query = $queryBuider->getQuery();
$query->execute();
$id = $query->getQuery['newObj']['_id'];
但是请注意,这在未来的版本中不一定有效,因为新的 MongoDB 驱动程序(将从 ODM 2.0 开始使用)没有此功能。
在我的 Symfony3 项目中,我确实有一些文档,例如 User,如下所述:
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;
}
而不是 returning true
,我想 return 我刚刚创建的文档的 ID.
寻找答案,我找到了这段代码:
$this->getDocumentManager()->getConnection()->lastInsertId
不幸的是,return不是我要找的东西:
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();
}
解决问题的最简单方法是通过调用 new \MongoId()
预先生成标识符,将其添加到您要插入的数据(在 _id
键下)并且 return 已知价值。此外,当您插入未明确设置标识符的文档时,这正是底层 MongoDB 驱动程序在幕后所做的(参见 this doc example)
MongoDB 驱动程序将 ID 写入传入的数组中,但由于查询对象的结构,您看不到它。您可以从 getQuery()
:
$query = $queryBuider->getQuery();
$query->execute();
$id = $query->getQuery['newObj']['_id'];
但是请注意,这在未来的版本中不一定有效,因为新的 MongoDB 驱动程序(将从 ODM 2.0 开始使用)没有此功能。