Есть 3 связанные таблицы с помощью 2 связующих таблиц.
Таблица books связывается с таблицей genres, так же books связывается с tags
Связь обычная
public function getLinkGenresBooks()
{
return $this->hasMany(LinkGenresBooks::className(), ['books_id' => 'id']);
}
public function getGenres()
{
return $this->hasMany(Genres::className(), ['id' => 'genres_id'])->via('linkGenresBooks');
}
public function getLinkTagsBooks()
{
return $this->hasMany(LinkTagsBooks::className(), ['books_id' => 'id']);
}
public function getTags()
{
return $this->hasMany(Tags::className(), ['id' => 'tags_id'])->via('linkTagsBooks');
}
Мне нужно на странице с книгой вывести подобные книги. Я считаю правильной логикой будет выбор книг у которых хотя бы 2 жанра И 2 тега такие же как у книги, на странице которой я нахожусь.
Проблема составления для этого SQL запроса. Попробовал поэкспериментировать, вроде что то выходит, но нет того, что именно 2 жанра и 2 тега.
$test = Books::find()->joinWith('genres g')->joinWith('tags t')->where(['or', ['g.id' => [1, 21, 30]]])->andWhere(['or', ['t.id' => [1, 5]]])->all();
Может я не совсем прав с логикой, тогда подскажите, как было бы более правильно сделать.