[英]Query relation in same table with Eloquent ORM in Laravel 4.1
[英]Filtering Eloquent ORM query by relation
我需要按關系過濾我的口才查詢。 我有以下關系:
User **has many** achievements
Game **has many** achievements
現在,我需要將用戶A的成就過濾為在游戲B中獲得的成就。這可以通過以下方式完成:
$user->achievements()->whereGameId($game->id)
很好,但是我可以直接使用$ game對象,而不是通過丑陋的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
模型上訪問成就,而不是'ugly' $game->id
:
$user->games->find($game)->achievements;
在我看來,將$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
(關系)。
這里是詳細信息(查詢關系)。
如果只想過濾achievments
而不是User
集合, achievments
需要在急切加載時使用閉包函數:
$game = Game::find($gameID);
//magic happens here
$users = User::with(
array('achievements' => function($query) use($game){
$query->where('gameId', $game->id);
}))
->get();
這僅限制achievments
關系,但不影響User
(主集合)
這里是詳細的說明(急切加載包含)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.