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);
我的应用程序中有一个玩家可以完成的模块列表,当他们完成时,他们必须停止出现在“可用模块”列表中。我有 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()
->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);