Элементы CakePHP GROUP и COUNT, возвращенные в списке - PullRequest
6 голосов
/ 15 июля 2011

Я знаю, что здесь есть некоторые подобные квесты, но они все о при использовании

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
)

Это работает, если я сделаю все вместо list , тем не менее, это просто даст мне гораздо более сложный массив для просмотра. Я нормально использую все , я просто сначала хотел посмотреть, была ли причина, по которой он не работает в списке ?

Ответы [ 2 ]

12 голосов
/ 15 июля 2011

Краткое резюме : у find ('list') есть проблемы с псевдонимами полей (и, следовательно, с агрегатными функциями, такими как COUNT() и т. Д.), Поэтому вы должны использовать вместо CakePHP 1.3.Для использования CakePHP 1.2 есть хитрое .

Подробно : Скорее всего, проблема заключается в

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 голос
/ 18 июля 2017

В контроллере в Paginator вы можете использовать так:

 $itemads = $this->paginate($itemads, ['contain' => ['Departments', 'Stores'],'group'=>'upc','fields'=>array("upc_count"=>"COUNT(`upc`)")]);
...