Symfomy Doctrine查询 - 获取每个父项的子项列表

时间:2016-10-26 05:20:02

标签: php symfony doctrine-orm doctrine

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

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

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

我认为我正在寻找的SQL术语是GROUP_CONCAT,但这似乎不在doctrine2中。所以在我试图安装扩展程序之前,我真的不明白,我想知道是否有一个使用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;

1 个答案:

答案 0 :(得分:2)

您可以简单地为您的案例使用获取联接。
chapter 14.2.2. Joins中查看有关获取联接的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();

现在结果包含一个包含您选择的字段的数组。