Laravel查询实现统计指定演员参演电影中出现次数最多的分类
正确实现代码
方案1:集合处理(逻辑简单易维护,适合数据量较小场景)
$src = ["Leonardo", "DiCaprio"]; // 查询该演员参演的所有电影,预加载分类关联 $films = Film::with('category') ->whereHas('actor', function($q) use ($src) { $q->where('first_name', $src[0]) ->where('last_name', $src[1]); })->get(); // 统计分类出现次数,取出现频次最高的分类 $mostUsedCategory = $films->pluck('category') ->flatten() ->countBy('name') ->sortDesc() ->keys() ->first();
方案2:SQL直接查询(性能更高,适合大数据量场景)
$src = ["Leonardo", "DiCaprio"]; $mostUsedCategory = Category::selectRaw('category.*, COUNT(film.film_id) as film_count') ->join('film_category', 'category.category_id', '=', 'film_category.category_id') ->join('film', 'film_category.film_id', '=', 'film.film_id') ->join('film_actor', 'film.film_id', '=', 'film_actor.film_id') ->join('actor', 'film_actor.actor_id', '=', 'actor.actor_id') ->where('actor.first_name', $src[0]) ->where('actor.last_name', $src[1]) ->groupBy('category.category_id') ->orderBy('film_count', 'desc') ->first();
注意事项
- 原代码中的
whereHas仅用于筛选满足关联条件的模型,内部的分组、排序逻辑不会生效,无法实现统计需求 - 你的模型类名均为小写,不符合Laravel命名规范,建议调整为大写开头(
Film、Actor、Category),避免自动加载报错 - 若存在多个分类出现次数并列第一的情况,将
first()改为get()即可返回所有并列最高的分类
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

