[英]Symfony Doctrine query - get a list of children for each parent
我目前正在尝试创建一个查询,该查询返回带有父名称和子名称列表的结果。
例如,假设我们有两个表Category
和Product
,其中Category
有许多Product
实体。 我知道我可以使用getProducts()
直接访问孩子,或者如果我没有使用共享 ID 和连接设置关联。 但是,此时我不确定如何进行,本质上,我想要一个如下所示的结果:
| Category.name | Product.name |
| Cars | BMW, Volvo, Fiat
| Bikes | BMX, Mountain Bike, Road Bike
我认为我正在寻找的 SQL 术语是GROUP_CONCAT ,但它似乎没有出现在science2 中。 因此,在我开始尝试安装一个我不太了解的扩展之前,我想知道是否有使用 Doctrine 和默认查询构建器的更简单的解决方案?
更新:
使用@Wilt 的回答,我稍微扩展了它以生成上面的确切表格:
$qm = $this->getEntityManager()->createQueryBuilder();
$qm->select('c', 'p')
->from('AppBundle:OmicsExperimentTypeStrings', 'c')
->leftJoin('c.omicsExperimentSubTypeStrings', 'p');
// Get query result as array for easier manipulation.
$results = $qm->getQuery()->getArrayResult();
$res = [];
// Iterate array structure and get c.name and an array of p.name.
foreach($results as $category) {
$res[$category['name']] = [];
foreach([$category['products']] as $productsArray) {
foreach ($productsArray as $product) {
array_push($res[$category['name']],$product['name']);
}
}
}
return $res;
您可以简单地为您的案例使用 fetch joins。
在第14.2.2章中查看有关 fetch join 的 Doctrine 文档。 加入。
在查询构建器中,您可以像这样获取连接:
$queryBuilder->select('c', 'p')
->from('Module\Entity\Category', 'c')
->leftJoin('c.products', 'p');
$results = $queryBuilder->getQuery()->getResult();
现在$results
包含一个类别集合,其中每个类别都填充了其产品集合。
我会说最好是获取对象并从视图中的对象(或任何需要它的地方)创建数组。
如果您真的只想获取字段,您可以更改 select 子句以选择您想要的字段。 不确定结果数组是否正是您想要的,但您可以尝试:
$queryBuilder->select('c.name', 'p.name')
->from('Module\Entity\Category', 'c')
->leftJoin('c.products', 'p');
$results = $queryBuilder->getResult();
现在结果保存了一个包含您选择的字段的数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.