2014-04-28 72 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所需的操作。 –