Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb DoctrineODM多级引用的启动_Mongodb_Symfony_Doctrine_Doctrine Odm - Fatal编程技术网

Mongodb DoctrineODM多级引用的启动

Mongodb DoctrineODM多级引用的启动,mongodb,symfony,doctrine,doctrine-odm,Mongodb,Symfony,Doctrine,Doctrine Odm,很抱歉标题很尴尬,但我没有更好的问题命名方法(欢迎评论如何正确命名问题) 假设我有3个文档: 类别 产品 版本 一个类别有许多产品。一个产品有很多版本。 现在我想查询所有类别,并列出每个类别的所有产品和版本 我知道启动 是否可以编写如下查询: $qb = $dm->createQueryBuilder('Category') ->field('products')->prime(true) ->field('products.versions')-&g

很抱歉标题很尴尬,但我没有更好的问题命名方法(欢迎评论如何正确命名问题)

假设我有3个文档:

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

我知道启动

是否可以编写如下查询:

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

好吧,在目前的状态下,odm似乎不支持多级启动。这是一个众所周知的问题

我在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);
    }
};
可将封盖传递至底漆:

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