簡體   English   中英

如何通過嵌套關系來加載多個關系和組

[英]How to eager load multiple relationships and group by a nested relation

在體育應用程序中,我想顯示每個團隊中的團隊和玩家列表,並按照他們的位置對玩家進行分組。

以下是模型關系的定義方式。

每個職位都與體育相關聯。 在足球你有CF,ST,GK等。在籃球你有PG,PF,C等。

class Sport {

  public function positions()
  {
    return $this->hasMany(\App\Position::class);
  }

}

Position類知道每個播放位置的玩家。

class Position {

  public function sport()
  {
    return $this->belongsTo(\App\Sport::class);
  }

  public function players()
  {
    return $this->hasMany(\App\Player::class);
  }

}

每個玩家都可以在一個團隊中扮演特定的角色。

class Player {

  public function position()
  {
    return $this->belongsTo(\App\Position::class);
  }

  public function team()
  {
    return $this->belongsTo(\App\Team::class);
  }

}

每個團隊都與體育直接相關,每個球員都可以在該團隊中發揮作用。

class Team {

  public function sport()
  {
    return $this->belongsTo(\App\Sport::class);
  }

  public function players()
  {
    return $this->hasMany(\App\Player::class);
  }

}

現在,這是我的問題。 我想返回一個球隊列表,每個球隊的位置,以及球隊中每個位置的球員。 我想要的回答看起來像這樣。

{
  "teams": [
    {
      "id": 1,
      "name": "Barcelona",
      "positions": [
        {
          "id": 1,
          "name": "Center Forward",
          "players": [
            {
              "id": 1,
              "name": "Lionel Messi"
            }
          ]
        }
      ]
    }
  ]
}

我嘗試了各種方法,但我似乎無法做到正確。 下面的代碼最終給了我一個可接受的結構,但球員不會被球隊過濾,所以我得到了所有參加比賽的球員,無論球隊如何。 例如,守門員位置將包含來自所有球隊的守門員,這絕對是錯誤的。

Team::with(['sport.positions.players'])->paginate();

我覺得它可能是這樣的。

Team::with(['players.position' => function ($query) { /* insert groupBy magic */ }])->paginate();

有任何想法嗎?

您應該讓您的團隊加載其他數據:

$teams->load('sport.positions.players');

注意 :在paginate函數中使用paginate count作為參數,如下所示:

$teams->load('sport.positions.players')->paginate(5);

您可以嘗試以下查詢:

$team = Team::with(['players','position'=>function($q){
   $q->groupBy('positio_name') ;
})->get();

完全是你想要的,但這應該給你一些足夠接近的東西。

首先在App\\Sport上定義teams關系

public function teams()
{
    return $this->hasMany(Team::class);
}

而不是去體育 - >位置 - >球員運動 - >球隊 - >球員 ,這樣你就可以免費獲得每隊球員的范圍,你可以按照他們的position每個隊員進行分組

Sport::with(['teams.players.position'])->find($sport_id)
    ->setRelation('teams',  $sport->teams->map(function($team){
        return $team->setRelation('players', $team->players->groupBy(function($player){
            return $player->position->name;
        }));
    }));

setRelation()用於覆蓋關系,而不是將具有關系名稱的屬性添加到模型實例。

希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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