我需要通过关系过滤我的Eloquent查询。我有以下关系:
User **has many** achievements
Game **has many** achievements
现在我需要将用户A的成就过滤到在游戏B中获得的成就。这可以这样做:
$user->achievements()->whereGameId($game->id)
这很好,但是我可以直接使用$ game对象而不是通过丑陋的ID列进行过滤吗?
答案 0 :(得分:0)
编辑:
所以这里有PR [{3}}可以让你这样做:
// 'game' being relation on the Achievement model
$user->achievements()->hasIn('game', $game);
// or equivalent dynamic call
$user->achievements()->hasInGame($game);
// of course you may use it like any other Builder method, for example:
User::hasInAchievements($achievement)->get();
除非Game
以某种方式与User
相关联,否则没有直接的方法。
要明确说明,User
和Game
是相关的,那么您可以访问注入Game
模型的游戏集合中的成就,而不是“丑陋的”#39; $game->id
:
$user->games->find($game)->achievements;
答案 1 :(得分:0)
在我看来,将$game
对象注入封闭方法并在急切加载时进行查询是一种更好的方法。
whereHas
和orWhereHas
用于通过查询关系来限制结果。
$game = Game::find($gameID);
//magic happens here
$users = User::whereHas('achievements', function($query) use($game){
$query->where('gameId', $game->id);
})
->with('achievments') //if you want to have them inside collection
->get();
这限制了User
(主要收集结果)和achievments
(关系)。
Here是一个详细信息(查询关系)。
如果你只是想过滤achievments
而不是User
集合,你只需要一个关注加载的闭包函数:
$game = Game::find($gameID);
//magic happens here
$users = User::with(
array('achievements' => function($query) use($game){
$query->where('gameId', $game->id);
}))
->get();
这只会限制achievments
关系,但不会影响User
(主要收藏)
Here有详细描述(Eager Loading Constains)