我需要通過關係過濾我的雄狐查詢。我有如下關係:通過關係過濾雄辯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所需的操作。 –
檢查我的編輯,工作液被作爲一個公關 –