Laravel - 基于数据透视表 table 状态的数据库查询项目

Laravel - DB Query items based on pivot table status

我的应用程序中有一个玩家可以完成的模块列表,当他们完成时,他们必须停止出现在“可用模块”列表中。我有 table“玩家”、“模块”和“module_player”来保存关系。

因此,对于“可用模块”列表,我只想显示尚未启动的模块(也就是 module_player table 上没有记录)或已经启动但尚未启动的模块还没有完成(也就是 module_player table 中的状态 1)。

假设我有:

玩家table

id name
1 Player_1
2 Player_2

模块table

id name
1 Module_1
2 Module_2
3 Module_3

module_player table

module_id player_id status
1 1 1
2 1 2

“可用列表”应该return只有模块 1(已开始但未完成)和模块 3(未开始)。

问题是我只得到“可用列表”中的模块 1,这是我的查询,显然其中有问题:

        $modules = \DB::table('modules')
            ->join('module_player', 'modules.id', '=', 'module_player.module_id', 'left')
            ->join('players', 'module_player.player_id', '=', 'players.id', 'left')
            ->where('module_player.status', '!=', 2)
            ->where('module_player.player_id, '=', 1)
            ->select('modules.id', 'modules.name', 'modules.image', 'modules.mandatory')->paginate(10);

谢谢

如您所用

`where('module_player.player_id, '=', 1)`

您将只获得 player_id 为 1 的记录,因此请使用 whereNotIn

尝试以下查询
$modules = \DB::table('modules')
                ->join('module_player', 'modules.id', '=', 'module_player.module_id', 'left')
                ->join('players', 'module_player.player_id', '=', 'players.id', 'left')
                ->whereNotIn('modules.id', function($query){
                     $query->select('module_id')
                     ->from('module_player')
                     ->where('status', 2);
                })
                ->select('modules.id', 'modules.name', 'modules.image', 'modules.mandatory')->paginate(10);

如果你想为任何特定用户使用它,你可以在 use()

中传递 player_id
->whereNotIn('modules.id', function($query) use($player_id){
                         $query->select('module_id')
                         ->from('module_player')
                         ->from('player_id', $player_id)
                         ->where('status', 2);
                    })

删除 ->where('module_player.player_id, '=', 1) 行,因为它将 return 记录 player_id 1. 然后尝试下面的查询

$modules = \DB::table('modules')
            ->join('module_player', 'modules.id', '=', 'module_player.module_id', 'left')
            ->join('players', 'module_player.player_id', '=', 'players.id', 'left')
            ->where('module_player.status', '!=', 2)
            ->select('modules.id', 'modules.name', 'modules.image', 'modules.mandatory')->paginate(10);