【问题标题】:Data eager loading in doctrine mongodb学说mongodb中的数据急切加载
【发布时间】:2021-03-19 09:18:39
【问题描述】:

对不起我的英语。我似乎在 mongo 的教义工作中遗漏了一些东西。我有

/**
 * @MongoDB\MappedSuperclass
 * @MongoDB\DiscriminatorField("type")
 * @MongoDB\DiscriminatorMap({
 *   "hotel"="App\Document\Attributes\HotelAttributes",
 *   "apartment"="App\Document\Attributes\ApartmentAttributes",
*/
abstract class AbstractAttribute 
{
    /**
     * @MongoDB\Id
     * @MongoDB\UniqueIndex()
     */
    protected string $id;
    ...
}

还有几类后代,比如:

namespace App\Document\Attributes;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
 * @MongoDB\Document(collection="attributes")
 * @MongoDB\InheritanceType("SINGLE_COLLECTION")
 * @MongoDB\HasLifecycleCallbacks
 */
class HotelAttributes extends AbstractAttribute
{
    /**
     * @MongoDB\Field(
     *     type="int",
     *     nullable=false,
     *     name="bed_places",
     * )
     */
    protected int $bedPlaces;

还有一个引用属性的资源类

class Resources
{
    /**
     * @MongoDB\ReferenceOne(
     *     targetDocument=AbstractAttribute::class,
     *     storeAs="dbRefWithDb",
     *     orphanRemoval=true,
     *     cascade={"all"}
     * )
     */
    protected AbstractAttribute $attributes;
    ...
}

资源创建正常,但是通过id获取时,属性字段没有加载,直到我尝试直接访问该属性,即:

$resource = $this->dm->getRepository(Resources::class)->find($id);
$resource->getAttributes() will return:

twig dump

$resource->getAttributes()->getCreated() - 将返回创建日期和所有字段。

我有两个问题:

  1. 如何让学说自动加载所有数据?
  2. 如何在我的示例中为抽象类指定存储库?

感谢您的帮助。

【问题讨论】:

标签: php mongodb symfony doctrine-odm


【解决方案1】:

ODM 中与fetch="EAGER" 最接近的是一个称为“启动引用”的过程。与 ORM 的 EAGER 不同,这将进行两个数据库查询(一个用于您正在寻找的临时文档,另一个用于它们的预备参考),因为没有可行的方法来实现类似 JOIN 的获取。您可以在文档中阅读有关启动的更多信息:https://www.doctrine-project.org/projects/doctrine-mongodb-odm/en/2.2/reference/priming-references.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2011-11-30
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多