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

Doctrine documents can not be loaded if the ID strategy is NONE

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

    ...
}

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

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