簡體   English   中英

按關系過濾雄辯的ORM查詢

[英]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(); 

除非GameUser某種聯系,否則沒有直接的方法可以做到這一點。

要明確地說,說UserGame是相關的,那么您可以在游戲集合注入Game模型上訪問成就,而不是'ugly' $game->id

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

在我看來,將$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();

這限制了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM