Laravel orderBy whereHas

时间:2016-12-15 21:34:08

标签: php laravel

此问题与Laravel (5.3) Eloquent - Relationship issue有关,请访问此网址以获取更多信息。

我最终得到了以下脚本:

$genres = ['action', 'drama', 'romance'];

$similiarSeries = TheSeries::whereHas('TheGenres', function($q) use($genres) {
        $q->whereIn('genre', $genres);
}, '>=', 1);

return $similiarSeries->take(10);

它的作用是:它检查上面变量至少有一个类型的电影,并返回10部电影(如果存在)。

问题在于他们的电影是以混乱的顺序返回的,相反,如果他们会优先播放动作,戏剧,浪漫,然后只返回2种类型的电影(如:戏剧,浪漫或浪漫,动作)。然后只有1种类型。

这是否可以在laravel?

更新

这是电影及其类型的示例列表:

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)

1 个答案:

答案 0 :(得分:2)

好的,来找你。

从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)排序。