Symfony Doctrine查询-获取每个父节点的子节点列表


Symfony Doctrine query - get a list of children for each parent

我目前要做的是创建一个查询,返回具有父名称和子名称的列表的结果。

例如,我们有两个表CategoryProduct,其中Category有许多Product实体。我知道我可以使用getProducts()直接访问子节点,或者如果我没有使用共享id和连接的关联设置。然而,在这一点上,我不确定如何继续,本质上,我想要一个看起来像这样的结果:

| Category.name | Product.name |
| Cars          | BMW, Volvo, Fiat
| Bikes         | BMX, Mountain Bike, Road Bike

我认为我正在寻找的SQL术语是GROUP_CONCAT,但这似乎不在doctrine2中。所以在我开始尝试安装一个扩展之前,我真的不明白,我想知道是否有一个更简单的解决方案,使用原则和默认的查询生成器?

更新:

使用@张伯伦的回答,我稍微扩展了一下,得到了上面的表格:

$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连接。
查看Doctrine文档中14.2.2章节的fetch join。加入 .

在查询生成器中,您可以这样获取连接:

$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();

现在results保存一个数组,其中包含您选择的字段。