如果ID策略为NONE,则无法加载Doctrine文档

问题描述 投票:0回答:1

我在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);

(实际上是虚假,虚假,错误 - 预期是真实,真实,真实)

文献:

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

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

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

    ...
}
doctrine doctrine-odm
1个回答
0
投票

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

/* @var $userRepo DocumentRepository */
$userRepo = $managerRegistry->getRepository(User::class);
$user = $userRepo->find(new \MongoId('5cb6377ae0b68801bc3b1771'));
© www.soinside.com 2019 - 2024. All rights reserved.