Фильтрация данных через вложенные joinWith

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Maksat1991
Сообщения: 57
Зарегистрирован: 2016.10.16, 00:15

Фильтрация данных через вложенные joinWith

Сообщение Maksat1991 »

Я выбираю юзеров вместе с их книгами и вместе с их авторами.
Юзер с книгами один-ко-многим.
Книга с авторами многие-ко-многим через промежуточную таблицу.

Код: Выделить всё

$users = Users::find()
                ->joinWith('books.linksBooksAuthors.author')
                ->andWhere('books.id')
                ->andWhere('links_books_authors.author_id')
                ->andWhere('author.id')
                ->all();
Таким образом я фильтрую только тех юзеров, у которых есть книги, а еще только такие книги, у которых есть авторы.
То есть если у юзера есть книги, но все они без авторов, то такой юзер мне не нужен.

И фильтрация работает для книг, то есть если у юзера нет книги, то в массив $users такою юзер не попадет.
Но почему-то не срабатывает фильтрация для авторов. Т.е. если юзер с книгами существует, но у него все книги без авторов, то такой юзер все-равно попадает в выборку.

Так же пробовал связывать таблицы books и authors в их моделях через viaTable, и делал так

Код: Выделить всё

$users = Users::find()
                ->joinWith('books.authors')
                ->andWhere('books.id')
                ->andWhere('authors.id')
                ->all();
По сути одно и то же. И тоже не работает.

Проверял запрос на mysql, он возвращает правильные данные, то есть если такой запрос написать в mysql то вся фильтрация срабатывает правильно.


Подозреваю, что надо делать joinWith вложенными друг в друга, а в каждом из этих вложенных joinWith писать свой andWhere.
Если это предположение верно, то я не нашел синтаксиса как это делается. В Yii 1.1 так можно было делать, здесь еще пока не нашел.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Фильтрация данных через вложенные joinWith

Сообщение Alexum »

Maksat1991 писал(а): 2017.05.24, 12:31 Подозреваю, что надо делать joinWith вложенными друг в друга, а в каждом из этих вложенных joinWith писать свой andWhere.
Если это предположение верно, то я не нашел синтаксиса как это делается. В Yii 1.1 так можно было делать, здесь еще пока не нашел.

Код: Выделить всё

...
->joinWith(['название_связи' => function($q){ 
    $q->joinWith('название_связи_2');
}]);
Можно в модели отдельные связи создать, которые уже будут включать andWhere.
Ответить