是否可以禁用ODM Doctrine的延迟加载?

时间:2017-09-06 13:47:57

标签: mongodb doctrine-orm doctrine odm

我们正在使用Silex和Doctrine(ODM)开发API,我们有对象Story,它们具有属性images

class Story extends AbstractDocument
{
    /** @MongoDB\Id */
    protected $id;

    /**
     * @MongoDB\ReferenceMany(
     *     targetDocument="MyNamespace\Documents\Image",
     *     storeAs="DBRef"
     * )
     */
    protected $images = [];

    // Other properties and methods
}

我们在存储库中获取方法(在AbstractRepository中,从中扩展所有其他存储库)。

public function get(string $documentId) : array
{
    $document = $this->createQueryBuilder()
        ->field('id')->equals($documentId)
        ->hydrate(false)
        ->getQuery()
        ->toArray();
}

此方法返回嵌入和引用的对象,但对于referenceMany,仅返回没有数据的ID。

是否可以拒绝延迟加载以获取所有文档?

我们发现了一种可能的解决方案 - 重写方法toArray

1 个答案:

答案 0 :(得分:0)

只要您使用->hydrate(false),就会指示ODM让您不受欢迎,并从MongoDB返回原始数据。您将referenceMany看作是一个id数组,因为这是原始表示,不涉及延迟加载。

解决问题的最简洁方法是实施StoryRepository,这会激发额外的查询以获取引用的图像:

public function get(string $documentId) : array
{
    $document = $this->createQueryBuilder()
        ->field('id')->equals($documentId)
        ->hydrate(false)
        ->getQuery()
        ->toArray();
    $document['images'] = /* ... */;
    return $document;
}