3

好吧,说得更清楚:我正在使用教义

我有一张桌子 品牌和产品

Brand
  id
  name

Product
  id
  name
  brand_id

我在数据库中有很多品牌和这些品牌的产品。我想检索按 Brand.name 的第一个后者分组的品牌列表(+ 其产品数量)。

ex: 
array( 
   n => array( 
        0 => array('Nike', 4 ),
        1 => array('North Pole', 18) 
        .....
   )
   .....
)

所以我的问题是这可以通过一个查询以一种有效的方式完成。我真的不想为每个brand.name 的第一个后者运行单独的查询。学说“分层数据”掠过我的脑海,但我相信它是为了不同的东西?谢谢

4

3 回答 3

1

如果您要多次使用这种形式的结果,那么将格式设置为 Hydrator 可能是值得的,如此处所述

在您的情况下,您可以创建一个选择 3 列的查询

  1. 品牌名称的第一个字母
  2. 品牌
  3. 计数(产品.id)

然后水合结果

$results = $q->execute(array(), 'group_by_first_column');
于 2011-07-17T03:12:43.287 回答
0

You cannot take it from database in that way, but you can fetch data as objects or arrays and then transform it to described form. Use foreach loops.

于 2011-01-22T23:05:37.120 回答
0

使用 Doctrine 时,您还可以使用原始 SQL 查询和水合物数组而不是对象。所以我的解决方案是使用本机 SQL 查询:

SELECT 
  brand.name,
  count(product.id) 
FROM 
  brand 
JOIN 
  product ON 
  brand.id=product.brand_id 
GROUP BY 
  brand.id ORDER BY brand.name;

然后在 PHP 中迭代结果以构建所需的数组。因为结果是这样排序的,Brand Name这很容易。如果您不保持数据库抽象,我认为也应该可以在 DQL 中表达此查询,只需水合一个数组而不是对象。

于 2011-01-25T21:24:12.610 回答