如果ID策略为NONE

时间:2019-04-16 20:57:40

标签: doctrine doctrine-odm

我在MongoDB上使用Doctrine。通常,我并不关心ID,但在某些情况下,在刷新之前我需要ID,以避免不必要的往返。 因此,我添加了ID策略“ NONE”,并在构造函数中设置了ID。 但是之后,我无法通过其ID加载文档。

加载文档的代码:

/* @var $userRepo DocumentRepository */
$userRepo = $managerRegistry->getRepository(User::class);
$qb = $userRepo->createQueryBuilder();
$qb->field('id')->in(['5cb6377ae0b68801bc3b1771']);
$user = $qb->getQuery()->execute()->getSingleResult();
var_dump($user instanceof User);

/* @var $userRepo DocumentRepository */
$userRepo = $managerRegistry->getRepository(User::class);
$users = $userRepo->findBy(['id' => '5cb6377ae0b68801bc3b1771']);
var_dump(count($users) === 1);

/* @var $userRepo DocumentRepository */
$userRepo = $managerRegistry->getRepository(User::class);
$user = $userRepo->find('5cb6377ae0b68801bc3b1771');
var_dump($user instanceof User);

(实际上是false,false,false-预期为true,true,true)

文档:

/**
 * @ODM\Document
 */
class User
{

    /**
     * @ODM\Id(strategy="NONE")
     */
    protected $id;

    public function __construct()
    {
        $this->id = new \MongoId();
    }

    ...
}

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为您在查找调用中使用了字符串。您需要使用MongoId,因为这就是您的标识符。所以:

/* @var $userRepo DocumentRepository */
$userRepo = $managerRegistry->getRepository(User::class);
$user = $userRepo->find(new \MongoId('5cb6377ae0b68801bc3b1771'));