DoctrineODM启动多级引用

时间:2015-03-04 12:56:27

标签: mongodb symfony doctrine doctrine-odm

对于尴尬的标题感到抱歉,但我没有更好的命名问题(欢迎评论如何正确命名问题)。

我们说我有3份文件:

  • 分类
  • 产品

一个类别有很多产品。产品有许多版本。 现在我想查询所有类别并列出每个类别的所有产品和版本。

我知道启动priming

是否可以编写如下查询:

$qb = $dm->createQueryBuilder('Category')
    ->field('products')->prime(true)
    ->field('products.versions')->prime(true)
$query = $qb->getQuery();

1 个答案:

答案 0 :(得分:1)

好吧,似乎在目前的状态中,教义-odm不支持多级启动。这是GitHub上的已知问题。

我在GitHub问题中找到了一个解决方案,它将一个闭包传递给prime方法,以允许至少两个级别的启动。希望这有助于某人。

$myPrimer = function(DocumentManager $dm, ClassMetadata $class, array $ids, array $hints) {
    $qb = $dm->createQueryBuilder($class->name)
        ->field($class->identifier)->in($ids);

    if ( ! empty($hints[Query::HINT_SLAVE_OKAY])) {
        $qb->slaveOkay(true);
    }

    if ( ! empty($hints[Query::HINT_READ_PREFERENCE])) {
        $qb->setReadPreference($hints[Query::HINT_READ_PREFERENCE], $hints[Query::HINT_READ_PREFERENCE_TAGS]);
    }

    $results = $qb->getQuery()->toArray();

    $nestedPrimers = array(
        'address' => true, // List of fields to prime
    );

    $uow = $dm->getUnitOfWork();
    $referencePrimer = new ReferencePrimer($dm, $uow);

    foreach ($nestedPrimers as $fieldName => $primer) {
        $primer = is_callable($primer) ? $primer : null;
        $referencePrimer->primeReferences($class, $results, $fieldName, $hints, $primer);
    }
};

Closure可以传递给Primer:

->field('club')->prime($myPrime)