Как найти сущности с общим родителем, используя matching () в CakePHP?

Мне нужно найти все статьи с тем же автором, что и данный список статей.

Вот мой пользовательский метод поиска:

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'
Что я делаю неправильно?

2

Решение

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

Цитата из документов:

[…] Точечные пути соответствия должны использоваться во вложенных вызовах match () […]

Поваренная книга> Доступ к базе данных & ORM> Получение данных & Наборы результатов> Фильтрация по связанным данным

В любом случае, использование точечной нотации вместо вложения должно решить проблему, т.е.

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]);
});
6

Другие решения

Если это отношение HasMany, мы можем легко это сделать:

return $query->where([
'Articles.author_id IN' => $this->find()
->select(['Articles.author_id'])
->where(['Articles.id IN' => $idList])
]);

// Благодаря jose_zap на канале CakePHP IRC

2

По вопросам рекламы [email protected]