Laravel实现展示用户最常选择的游戏(含游戏名称)
问题描述
我有一张名为usuarios_tienen_videojuegos的中间表,包含user_id和videogames_id字段。我想要展示用户最常选择的电子游戏,目前仅能显示游戏ID,还需显示存储在Videogames表中的游戏名称,该如何实现?
现有代码
控制器(Controller)
public function usuariosVista() { $videogames = Videogames::with(['plataforma', 'generos', 'categoria', 'numJugadores', 'users'])->get(); $users = User::with('usersVideogames')->get(); $PopularGames = DB::table('usuarios_tienen_videojuegos') ->select('videogames_id', DB::raw('COUNT(*) as seleccionados_count')) ->groupBy('videogames_id') ->orderByDesc('seleccionados_count') ->take(5) ->get(); return view('admin.videojuegos.usuarios', [ 'videogames' => $videogames, 'users' => $users, 'PopularGames' => $PopularGames, ]); }
视图(Blade)
@foreach($PopularGames as $game) <li>{{ $game->videogames_id }} (Selected by {{ $game->seleccionados_count }} users)</li> @endforeach
User模型
public function usersVideogames() { return $this->belongsToMany(VideoJuegos::class, 'usuarios_tienen_videojuegos', 'user_id', 'videogames_id'); }
解决方案
你可以通过关联查询Videogames表获取游戏名称,以下是两种实用实现方式:
方式一:DB查询构建器关联表
修改控制器中$PopularGames的查询逻辑,通过join关联Videogames表并选择游戏名称字段:
$PopularGames = DB::table('usuarios_tienen_videojuegos') ->join('videogames', 'usuarios_tienen_videojuegos.videogames_id', '=', 'videogames.id') // 替换nombre为你实际的游戏名字段,比如name ->select('videogames.id', 'videogames.nombre as game_name', DB::raw('COUNT(*) as seleccionados_count')) ->groupBy('videogames.id', 'videogames.nombre') ->orderByDesc('seleccionados_count') ->take(5) ->get();
视图中直接调用game_name字段展示:
@foreach($PopularGames as $game) <li>{{ $game->game_name }} (被 {{ $game->seleccionados_count }} 位用户选择)</li> @endforeach
方式二:Eloquent关联统计(更符合Laravel风格)
先确保Videogames模型中定义了与User的多对多关联:
// Videogames模型代码 public function users() { return $this->belongsToMany(User::class, 'usuarios_tienen_videojuegos', 'videogames_id', 'user_id'); }
然后修改控制器的$PopularGames查询,利用Eloquent的withCount自动统计关联数量:
$PopularGames = Videogames::withCount('users') ->orderByDesc('users_count') ->take(5) ->get();
视图中直接使用模型字段展示:
@foreach($PopularGames as $game) <li>{{ $game->nombre }} (被 {{ $game->users_count }} 位用户选择)</li> @endforeach
这种方式代码更简洁,也更符合Laravel的ORM设计理念。
内容的提问来源于stack exchange,提问作者designArg
相关产品推荐
相关产品推荐

