2014-04-28 41 views
0

我需要通过关系过滤我的雄狐查询。我有如下关系:通过关系过滤雄辩ORM查询

User **has many** achievements

Game **has many** achievements

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

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

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

+0

检查我的编辑,工作液被作为一个公关 –

回答

0

编辑:

因此,这里的PR https://github.com/laravel/framework/pull/4267,可以让你做到这一点

// '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模型而不是“丑” $game->id

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

Dude,用户与游戏没有任何关系。 –

+1

那么你期望的究竟是什么?不是引用$ game-> id,而是通过注入$ game来使它看起来更好? –

+0

@RafałWalczak如果你更密切地关注@ deczo的代码,你会注意到他使用点符号从“游戏”表格到“成就”。看看在Laravel文档中热切加载嵌套关系:http://laravel.com/docs/eloquent#eager-loading –

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(); 

这与achievments(关系)沿着限制两者User(主要收集结果)。

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“SA的详细说明(预先加载Constains)

+0

这和我的例子一样,但方式更复杂。 –

+0

@RafałWalczak如果OP在一个循环中,您的回答不会急于加载,这对大数据来说是一个严重的性能问题。 – Arda

+0

就像我所说的:目前没有办法将模型注入到查询生成器方法中来执行OP所需的操作。 –