如何强制 Doctrine MongoDB ODM 文档代理转换为“原始”文档代理文档?

发布于 2024-11-14 14:48:14 字数 219 浏览 3 评论 0原文

我有一个在文档 User 中引用的文档 Person。当我检索 User 时,它没有嵌入 Person 对象,而是嵌入了 Person 代理对象。有没有办法“强制”代理成为“完整”文档(因此 Person proxy => Person)。

我尝试调用一个方法来检索附加数据(因此 __load 被触发,但该对象仍然是“代理”版本。

我希望有人可以比 ODM 的文档更清楚地说明这一点。

I have a document Person referenced in document User. When I retrieve User, it doesn't have a Person object embedded, but a Person proxy object. Is there a way to "force" the proxy to become a "full" document (so Person proxy => Person).

I've tried calling a method to retrieve additional data (so __load gets triggered, but the object remains the 'proxy' version.

I hope someone can shed more light on this than the ODM's documention does.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

会发光的星星闪亮亮i 2024-11-21 14:48:14

您可以通过 启动参考来完成此操作

示例文档:

/** @Document */
class User
{
    /** @ReferenceOne(targetDocument="Person") */
    private $person;
}

/** @Document */
class Person
{
    // ...
}

使用 QueryBuilder:

/* @var $user User */
$user = $dm->createQueryBuilder('User')
    ->field('person')->prime(true)
    ->getQuery()
    ->getSingleResult();

You can accomplish this by Priming References.

Example Documents:

/** @Document */
class User
{
    /** @ReferenceOne(targetDocument="Person") */
    private $person;
}

/** @Document */
class Person
{
    // ...
}

Using the QueryBuilder:

/* @var $user User */
$user = $dm->createQueryBuilder('User')
    ->field('person')->prime(true)
    ->getQuery()
    ->getSingleResult();
究竟谁懂我的在乎 2024-11-21 14:48:14

您不需要提取原始对象,因为 Proxy 类对您的代码应该 100% 透明。

如果您需要序列化文档(例如通过 API 发送文档),请务必在文档上正确实现 serialize() 方法。

如果您仍然需要在没有代理的情况下获取引用的文档,您可以使用 prime() 来获取它,或者使用指定 enchant(false) 的单独查询来获取它:

$user = $dm->createQueryBuilder('Person')
            ->field('_id')->equals($user->getPerson()->getId())
            ->hydrate(false)

请参阅:
Doctrine ODM 文档:禁用水合 了解更多信息。

You shouldn't need to extract the original object, since the Proxy class should be 100% transparent to your code.

If you need to serialize the document, for example to send it through an API, be sure to correctly implement the serialize() method on your Document.

If you still need to get the referenced document without the proxy, you can either prime() it or fetch it with a separate query specifying the hydrate(false):

$user = $dm->createQueryBuilder('Person')
            ->field('_id')->equals($user->getPerson()->getId())
            ->hydrate(false)

See:
Doctrine ODM Doc: Disabling hydration for more info.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文