У меня есть модель, статьи, в которой есть много рефератов. Я хочу загрузить 10 последних статей, а для каждой статьи - тезисы с наибольшим количеством очков. Моя функция выглядит так:
public function getArticles($category, $viewName) {
$subArticles = $this->Articles->findByCategory($category)->contain([
'Abstracts' => function ($q) {
return $q
->select(['body', 'points', 'article_id'])
->where(['Abstracts.approved' => true])
->limit(10)
->order(['Abstracts.points' => 'DESC']);
}
])
->limit(10)
->order(['Articles.created' => 'DESC']) ;
$this->set( $viewName . 'Articles', $subArticles );
}
Результат, который я получаю, не то, что я предполагаю. Просматривая SQL, сначала CakePHP получает articles.id всего в категории (отлично). Затем CakePHP переходит в таблицу Abstracts, используя те 10 articles.id, которые он только что нашел, и просит 10 тезисов с самыми высокими голосами (которые принадлежат этим статьям).
Проблема в том, что я хочу 1 Аннотация для каждой статьи, а не 10 тезисов, принадлежащих к любой статье этой категории. Как я могу это исправить? Спасибо!
ИЗМЕНИТЬ
ndm предположил, что это был дубликат Использование limit() на содержащейся модели, поэтому я попытался найти решение там. А именно, я добавил это к моей модели:
$this->hasOne('TopAbstract', [
'className' => 'Abstracts',
'foreignKey' => 'abstract_id',
'strategy' => 'select',
'sort' => ['TopAbstract.points' => 'DESC'],
'conditions' => function ($e, $query) {
$query->limit(1);
return $e;
} ]);
И затем я пытаюсь найти статьи byCategory, содержащие contains (['TopAbstract']), только это убивает мой SQL. Он умирает от ужасной смерти:
Error: SQLSTATE[HY000]: General error: 1 near ")": syntax error
Отладка даже не показывает запрос, который его убил, поэтому я не уверен, как отлаживать этот файл?
ИЗМЕНИТЬ
Разговор с самим собой немного, но ошибка определенно находится в "условиях" части hasOne. Я вынимаю это, и он отлично работает. Невозможно найти пример того, как это должно выглядеть на interwebs. У кого-нибудь есть идея?