按关系过滤Eloquent ORM查询

时间:2014-04-28 13:07:41

标签: php laravel eloquent

我需要通过关系过滤我的Eloquent查询。我有以下关系:

User **has many** achievements

Game **has many** achievements

现在我需要将用户A的成就过滤到在游戏B中获得的成就。这可以这样做:

$user->achievements()->whereGameId($game->id)

这很好,但是我可以直接使用$ game对象而不是通过丑陋的ID列进行过滤吗?

2 个答案:

答案 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相关联,否则没有直接的方法。

要明确说明,UserGame是相关的,那么您可以访问注入Game模型的游戏集合中的成就,而不是“丑陋的”#39; $game->id

$user->games->find($game)->achievements;

答案 1 :(得分:0)

在我看来,将$game对象注入封闭方法并在急切加载时进行查询是一种更好的方法。

whereHasorWhereHas用于通过查询关系来限制结果。

$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)