gpt4 book ai didi

php - doctrine ODM 加载相关文档导致查询过多

转载 作者:可可西里 更新时间:2023-11-01 09:14:43 31 4
gpt4 key购买 nike

我一直在尝试减少 Web API 上的数据库查询数量。我的数据库有 3 个集合:playgroundwidgettoken

一个 Playground 有很多小部件,一个小部件有一个 token 。每个关系都使用 referencesOne/referenceMany

这是我的简化模型

/**
* @MongoDB\Document()
*/
class Widget
{
/**
* @MongoDB\ReferenceOne(targetDocument="Token", inversedBy="widgets")
*/
protected $token;

/**
* @MongoDB\ReferenceOne(targetDocument="Playground", inversedBy="widgets")
*/
protected $playground;
}

/**
* @MongoDB\Document()
*/
class Playground
{
/**
* @MongoDB\ReferenceMany(targetDocument="Widget", mappedBy="playground")
*/
protected $widgets;
}

/**
* @MongoDB\Document()
*/
class Token
{
/**
* @MongoDB\ReferenceMany(targetDocument="Widget", mappedBy="token")
*/
protected $widgets;
}

我需要使用完整的 playground 及其所有小部件和标记,但默认情况下,Doctrine 进行了太多查询:一个获取 playground (ok),一个获取映射的所有小部件 (ok) 以及每个小部件,一个获取 token 的查询(不行)。有没有办法一次查询所有 token 而不是一个一个地获取它们?

我看过 prime,但它似乎没有解决我的问题...

除了使用查询构建器并手动混合所有对象以减少查询计数之外,还有其他方法吗?

编辑:正如我在评论中添加的那样,我正在寻找的是将 Playground 及其所有依赖项作为一个大对象获取,对其进行 json 编码并将其返回到响应中。

我现在做的是查询 playground 并对其进行编码,但 Doctrine 以一种非高效的方式填充依赖关系:首先是获取 playgroung 的查询,然后是获取相关小部件的另一个查询,然后是是每个小部件获取其 token 的一个查询。

由于一个 Playground 可以有数百个小部件,这会导致数百个数据库查询。

我正在寻找一种方法来告诉 Doctrine 仅使用 3 个查询(一个用于获取 playgroung,一个用于获取小部件,一个用于获取 token )来获取所有这些数据。

最佳答案

更新:因为 $playground 中的 ArrayCollection 应该包含所有的小部件至少作为代理对象(或者应该在访问时加载),下面应该工作获取所有必需的 token ...

由于文档管理器保留所有托管对象,它应该防止发生额外的查询。 (注意 execute 中省略的赋值)。

$qb = $dm->createQueryBuilder('Token')->findBy(['widget' => $playground->getWidgets()]);
$qb->getQuery()->execute();

灵感来自 this page on how to avoid doctrine orm traps - point 5

旧/原始答案

老实说,我对 mongodb 不太熟悉,但根据教义 priming references ,您应该能够通过以下方式稍微舒适地为您的 Playground 补水:

$qb = $dm->createQueryBuilder('Widget')->findBy(['playground' => $playground]);
$qb->field('token')->prime(true);
$widgets = $qb->getQuery()->execute();

但是,我可能错了。

关于php - doctrine ODM 加载相关文档导致查询过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55161035/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com