CakePHP GROUP和COUNT项在列表中返回

时间:2011-07-15 19:00:31

标签: cakephp count group-by cakephp-1.3

我知道这里有类似的问题,但是在使用

时都是如此
Model->find('all');

但那不是我正在做的事情,我在做:

Model->find('list');

这是什么使得这种工作与不工作之间存在差异。


鉴于一组产品,我想找到该组中的所有品牌以及每个品牌的数量。

听起来很简单,这就是我所做的:

$fields = array('Product.brand','COUNT(`Product`.`brand`) AS brand_count')
$brand_data = $this->Product->find('list',array(
    'fields'=>$fields,
    'conditions'=>$conditions,
    'recursive'=>0,
    'group' => 'Product.brand'
));
debug($brand_data);

在此,我告诉它给我一个数组,其中键为Product.brand,值为COUNT(Product.brand)

我得到了这个:

Array
(
    [Brand A] => 
    [Brand B] => 
    [Brand C] =>  
)

当我预料到这一点时:

Array
(
    [Brand A] => 534
    [Brand B] => 243
    [Brand C] => 172
)

如果我全部而不是列表,它会起作用,但它只是给我一个更复杂的数组来深入研究。我很好用全部,我只是想先看看它是否有理由不在列表中

2 个答案:

答案 0 :(得分:12)

简要回顾:find('list')存在别名字段问题(因此聚合函数如COUNT()等),所以你应该使用CakePHP的1.3代替。对于CakePHP 1.2,使用a contraption

<强>详细: 最可能的问题在于你的

COUNT(`Product.brand`) AS brand_count

因为find('list')确实

Set::combine($results, $lst['keyPath'], $lst['valuePath'], $lst['groupPath']) 

查询结果,其中$lst['valuePath']

"{n}.COUNT(`Product`.`brand`) AS brand_count"

而在结果中它实际上是"{n}.Product.brand_count" - 不排队。

尝试将COUNT()设为虚拟字段。

即:

//model
var $virtualFields = array(
    'brand_count' => 'COUNT(Product.brand)'
);

//controller
$fields = array('Product.brand','Product.brand_count');

答案 1 :(得分:1)

在Paginator的控制器中你可以像这样使用:

.sub-ol-1 {
  list-style: none;
}

.sub-ol-1 > li {
  position: relative;
}

.sub-ol-1 > li:before {
  position: absolute;
  left: -34px;
  width: 30px;
  text-align: right;
}

.sub-ol-1 > li:nth-child(1):before {content: '1.1.';}
.sub-ol-1 > li:nth-child(2):before {content: '1.2.';}
.sub-ol-1 > li:nth-child(3):before {content: '1.3.';}
.sub-ol-1 > li:nth-child(4):before {content: '1.4.';}
.sub-ol-1 > li:nth-child(5):before {content: '1.5.';}
.sub-ol-1 > li:nth-child(6):before {content: '1.6.';}
.sub-ol-1 > li:nth-child(7):before {content: '1.7.';}
.sub-ol-1 > li:nth-child(8):before {content: '1.8.';}
.sub-ol-1 > li:nth-child(9):before {content: '1.9.';}
.sub-ol-1 > li:nth-child(10):before {content: '1.10.';}
/* more if needed */