Laravel 8 - 限制连接表
Laravel 8 - Limit joined tables
所以我的数据结构如下:
User
id
Collection
user_id
game_id
Game
id
status
在我的模型中,我有这样的关系:
User::hasMany(Collection)
Collection::belongsTo(Game)
Game::hasMany(Collection)
所以我想做的是获取用户列表并通过集合 table 包含所有相关游戏。但我只想包括那些具有特定状态的游戏。我正在使用的代码(不起作用)如下:
User::with('collections.game')->whereHas('collections.game', function ($query) {
return $query->where('status', '<>', 'denied');
})->get()
我的问题是所有游戏记录都被返回,包括状态为 denied
的记录。我正在四处阅读,上面的内容似乎应该有效,但事实并非如此。
我做错了什么?
你做不到whereHas('collections.game', ...)
。你必须做一个 whereHas
of a whereHas
:
User::with('collections.game')
->whereHas('collections', function (Builder $query) {
return $query->whereHas('game', function (Builder $query) {
return $query->where('status', '<>', 'denied');
})
})
->get()
我相信您需要对 with()
子句进行筛选,因为 whereHas()
将仅筛选用户数据,但急切加载的关系不会自动包含该筛选器。
User::with(['collections.game' => function ($query) {
return $query->where('status', '<>', 'denied');
}])
->whereHas('collections.game', function ($query) {
return $query->where('status', '<>', 'denied');
})->get()
所以我的数据结构如下:
User
id
Collection
user_id
game_id
Game
id
status
在我的模型中,我有这样的关系:
User::hasMany(Collection)
Collection::belongsTo(Game)
Game::hasMany(Collection)
所以我想做的是获取用户列表并通过集合 table 包含所有相关游戏。但我只想包括那些具有特定状态的游戏。我正在使用的代码(不起作用)如下:
User::with('collections.game')->whereHas('collections.game', function ($query) {
return $query->where('status', '<>', 'denied');
})->get()
我的问题是所有游戏记录都被返回,包括状态为 denied
的记录。我正在四处阅读,上面的内容似乎应该有效,但事实并非如此。
我做错了什么?
你做不到whereHas('collections.game', ...)
。你必须做一个 whereHas
of a whereHas
:
User::with('collections.game')
->whereHas('collections', function (Builder $query) {
return $query->whereHas('game', function (Builder $query) {
return $query->where('status', '<>', 'denied');
})
})
->get()
我相信您需要对 with()
子句进行筛选,因为 whereHas()
将仅筛选用户数据,但急切加载的关系不会自动包含该筛选器。
User::with(['collections.game' => function ($query) {
return $query->where('status', '<>', 'denied');
}])
->whereHas('collections.game', function ($query) {
return $query->where('status', '<>', 'denied');
})->get()