Php Symfony条令查询-获取每个父项的子项列表
我目前正在尝试创建一个查询,该查询返回一个包含父名称和子名称列表的结果 例如,假设我们有两个表Php Symfony条令查询-获取每个父项的子项列表,php,symfony,doctrine-orm,doctrine,Php,Symfony,Doctrine Orm,Doctrine,我目前正在尝试创建一个查询,该查询返回一个包含父名称和子名称列表的结果 例如,假设我们有两个表Category和Product,其中Category有许多Product实体。我知道我可以使用getProducts()直接访问子级,或者如果我没有使用共享ID和连接的关联设置。然而,在这一点上,我不确定如何继续,本质上,我想要的结果如下: | Category.name | Product.name | | Cars | BMW, Volvo, Fiat | Bikes
Category
和Product
,其中Category
有许多Product
实体。我知道我可以使用getProducts()
直接访问子级,或者如果我没有使用共享ID和连接的关联设置。然而,在这一点上,我不确定如何继续,本质上,我想要的结果如下:
| Category.name | Product.name |
| Cars | BMW, Volvo, Fiat
| Bikes | BMX, Mountain Bike, Road Bike
$queryBuilder->select('c', 'p')
->from('Module\Entity\Category', 'c')
->leftJoin('c.products', 'p');
$results = $queryBuilder->getQuery()->getResult();
我想我正在寻找的SQL术语是,但它似乎不在我的字典中。因此,在我开始尝试安装一个我不太理解的扩展之前,我想知道是否有一个更简单的解决方案使用条令和默认查询生成器
更新:
使用@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 join即可。
在中查看有关fetch join的条令文档 在查询生成器中,您可以按如下方式获取联接:
| Category.name | Product.name |
| Cars | BMW, Volvo, Fiat
| Bikes | BMX, Mountain Bike, Road Bike
$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();
现在,结果包含一个包含您选择的字段的数组。事实证明,我遇到的问题比我想象的要多,您能否更新您的答案,使其仅选择
类别.name
和产品.name
?我尝试自己修改它,但到目前为止都没有成功。我所做的是在使用getArrayResult()
运行查询后编辑查询,但我想我也可以直接在查询本身中进行编辑?@Darkstarone我添加了一个更新。我希望它返回您想要的数组(我没有测试它)…第二个查询返回一个数组,其中每个条目都是一个单独的p.name
封装在它自己的数组中。谢谢你的努力,我可以好好利用我的工作!