Мне нужно найти все статьи с тем же автором, что и данный список статей.
Вот мой пользовательский метод поиска:
public function findSimilar(Query $query, array $options)
{
if (empty($options['idList'])) {
throw new Exception('idList is not populated');
}
// We are given a list of article IDs
$idList = $options['idList'];
return $query->matching('Authors', function ($q) use ($idList) {
return $q->matching('Articles', function ($q2) use ($idList) {
return $q2->where(['Articles.id IN' => $idList]);
});
});
}
К сожалению, я получаю следующее сообщение об ошибке:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'Articles'
Что я делаю неправильно?
Есть много ограничений с вложенным соответствием, и это может быть одним из них. Я не могу сказать, является ли это ошибкой, поэтому вы можете проверить проблемы на GitHub и в конечном итоге подать новый для уточнения.
Цитата из документов:
[…] Точечные пути соответствия должны использоваться во вложенных вызовах match () […]
В любом случае, использование точечной нотации вместо вложения должно решить проблему, т.е.
return $query->matching('Authors.Articles', function ($q) use ($idList) {
return $q->where(['Articles.id IN' => $idList]);
});
И если вы хотите, чтобы соответствовать Authors
Вы можете сложить совпадения, как
return $query
->matching('Authors', function ($q) {
return $q->where(['Authors.foo' => 'bar']);
})
->matching('Authors.Articles', function ($q) use ($idList) {
return $q->where(['Articles.id IN' => $idList]);
});
Если это отношение HasMany, мы можем легко это сделать:
return $query->where([
'Articles.author_id IN' => $this->find()
->select(['Articles.author_id'])
->where(['Articles.id IN' => $idList])
]);
// Благодаря jose_zap на канале CakePHP IRC