我需要通过关系过滤我的雄狐查询。我有如下关系:通过关系过滤雄辩ORM查询
User **has many** achievements
Game **has many** achievements
现在我需要过滤用户A的成就那些在游戏中获得的B.这是可以做到这样:
$user->achievements()->whereGameId($game->id)
这很好,但我可以直接使用$游戏对象而不是通过丑陋的ID列过滤吗?
我需要通过关系过滤我的雄狐查询。我有如下关系:通过关系过滤雄辩ORM查询
User **has many** achievements
Game **has many** achievements
现在我需要过滤用户A的成就那些在游戏中获得的B.这是可以做到这样:
$user->achievements()->whereGameId($game->id)
这很好,但我可以直接使用$游戏对象而不是通过丑陋的ID列过滤吗?
编辑:
因此,这里的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
。
要清楚,说User
和Game
是相关的,那么你就可以访问游戏成就系列注入Game
模型而不是“丑” $game->id
:
$user->games->find($game)->achievements;
Dude,用户与游戏没有任何关系。 –
那么你期望的究竟是什么?不是引用$ game-> id,而是通过注入$ game来使它看起来更好? –
@RafałWalczak如果你更密切地关注@ deczo的代码,你会注意到他使用点符号从“游戏”表格到“成就”。看看在Laravel文档中热切加载嵌套关系:http://laravel.com/docs/eloquent#eager-loading –
注入$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();
这与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)
这和我的例子一样,但方式更复杂。 –
@RafałWalczak如果OP在一个循环中,您的回答不会急于加载,这对大数据来说是一个严重的性能问题。 – Arda
就像我所说的:目前没有办法将模型注入到查询生成器方法中来执行OP所需的操作。 –
检查我的编辑,工作液被作为一个公关 –