Попробуйте это:
$user['User']['report_count'] = $this->Report->find('count',
array( 'conditions' => array('Report.user_id' => $user['User']['id']),
'fields' => 'DISTINCT Report.report_id'
)
);
Он должен получить все различные report_id
с для данного user_id
, а затем сосчитать их. По сути, он должен выполнить запрос:
SELECT DISTINCT report_id FROM Reports WHERE user_id=$user['User']['id']
(после подстановки значения $user['User']['id']
), затем подсчитайте количество строк в результате. Предостережение: я не использую CakePHP в реальной жизни, я просто прочитал документацию ; Ваш пробег может варьироваться. Как уже упоминалось в галокурсе, выполнение одного запроса SQL самостоятельно будет более эффективным, чем вызов find(...)
для каждого идентификатора пользователя. Вы также можете попробовать:
$report_counts = $this->Report->find('list',
array( 'conditions' => array('Report.user_id' => array_map(create_function('$user', 'return $user["User"]["id"];'), $users)),
'group' => array('Report.user_id'),
'fields' => array('Report.user_id', 'COUNT(DISTINCT Report.report_id) AS report_count')
)
);
foreach ($users as &$user) {
$user['User']['report_count'] = $report_counts[$user['User']['id']];
}
Однако я не знаю, будет ли CakePHP принимать агрегатные функции в параметре 'fields'
, и я не знаю, как если бы find('list', ...)
выбрал Report.user_id
в качестве индекса массива. Если у вас возникли проблемы с последним, вы можете переключиться на [find('all', ...)][3]
вызов и выполнить цикл $report_counts
вместо $users
. Я не использовал этот подход, потому что я не знаю структуру $ users, например, как она проиндексирована.