Multi-Level 参考文献的 DoctrineODM 启动
DoctrineODM Priming of Multi-Level References
抱歉,标题很尴尬,但我没有更好的问题命名(欢迎就如何正确命名问题发表评论)。
假设我有 3 个文档:
- 类别
- 产品
- 版本
一个类别有很多产品。一个产品有很多版本。
现在我想查询所有类别并列出每个类别的所有产品和版本。
我知道启动 priming。
是否可以编写如下查询:
$qb = $dm->createQueryBuilder('Category')
->field('products')->prime(true)
->field('products.versions')->prime(true)
$query = $qb->getQuery();
好吧,目前看来doctrine-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);
}
};
可以将闭包传递给 Primer:
->field('club')->prime($myPrime)
抱歉,标题很尴尬,但我没有更好的问题命名(欢迎就如何正确命名问题发表评论)。
假设我有 3 个文档:
- 类别
- 产品
- 版本
一个类别有很多产品。一个产品有很多版本。 现在我想查询所有类别并列出每个类别的所有产品和版本。
我知道启动 priming。
是否可以编写如下查询:
$qb = $dm->createQueryBuilder('Category')
->field('products')->prime(true)
->field('products.versions')->prime(true)
$query = $qb->getQuery();
好吧,目前看来doctrine-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);
}
};
可以将闭包传递给 Primer:
->field('club')->prime($myPrime)