我知道这里有一些类似的问题,但它们都是关于何时使用
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 )
它可以工作,如果我做所有而不是列表,它只是给我一个更复杂的数组来钻取.我很好用所有,我只是想先看看它是否有理由不在列表中工作?
简要回顾: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');