[英]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.