繁体   English   中英

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 ,但它似乎没有出现在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM