Этот вопрос связан с: Laravel (5.3) Eloquent – проблема отношений , пожалуйста, зайдите на этот URL для получения дополнительной информации.
Я закончил со следующим сценарием:
$genres = ['action', 'drama', 'romance']; $similiarSeries = TheSeries::whereHas('TheGenres', function($q) use($genres) { $q->whereIn('genre', $genres); }, '>=', 1); return $similiarSeries->take(10);
Что он делает: он проверяет фильмы, которые имеют по крайней мере 1 жанр из вышепеременной, и возвращает 10 фильмов (если они существуют).
Проблема в том, что они снимаются в хаотичном порядке, вместо этого я бы предпочел бы, чтобы они показывали приоритет фильмам: action, drama, romance, а затем возвращать эти фильмы только с двумя жанрами (например: драма, романтика или романтика, действие). а затем только 1 жанр.
Возможно ли это в ларавеле?
Это примерный список фильмов и их жанров:
Zootopia: Action, Animation, Drama Toy Story: Action, Drama, Romance Kung Fu Panda: Action, Animation, Fantasy Avatar: Action, Drama, Romance Titanic: Action, Drama, Romance Avengers: Fantasy, Drama, Fiction Batman: Adventure
Поэтому, если мы ищем фильмы, в которых есть хотя бы одно из «действий», «драмы», «романтики»)
Я ожидаю возвращения:
Toy Story (Action, Drama, Romance) (3) Avatar (Action, Drama, Romance) (3) Titanic (Action, Drama, Romance) (3) Zootopia (Action, Drama) (2) Kung Fu Panda (Action) (1) Avengers (Drama) (1) Batman (0)
Ок, ты.
Начиная с Laravel 5.2.41 вы можете использовать withCount()
следующим образом:
$similiarSeries = TheSeries::whereHas('TheGenres', function($q) use($genres) { $q->whereIn('genre', $genres); })->withCount(['TheGenres' => function ($query) use ($genres) { $query->whereIn('genre', $genres); }])->orderBy('TheGenres_count', 'desc'); return $similiarSeries->take(10);
Это будет упорядочено по совпадению количества жанров (desc).