Как найти объекты с общим родителем, используя match() в 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' Что я делаю неправильно?


person Benjamin Tamasi    schedule 28.02.2016    source источник


Ответы (2)


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

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

[...] Пунктирные пути сопоставления должны использоваться поверх вложенных вызовов соответствия() [...]

Поваренная книга > Доступ к базе данных и 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]);
    });
person ndm    schedule 28.02.2016

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

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

// Спасибо jose_zap на IRC-канале CakePHP

person Benjamin Tamasi    schedule 28.02.2016