Php 如何加载多个关系并按嵌套关系分组
在一个体育应用程序中,我想显示一个团队和每个团队中的球员的列表,并根据他们的位置对球员进行分组 下面是如何定义模型关系的 每个位置都与一项运动相关。在足球中你会有CF、ST、GK等,在篮球中你会有PG、PF、C等Php 如何加载多个关系并按嵌套关系分组,php,laravel,Php,Laravel,在一个体育应用程序中,我想显示一个团队和每个团队中的球员的列表,并根据他们的位置对球员进行分组 下面是如何定义模型关系的 每个位置都与一项运动相关。在足球中你会有CF、ST、GK等,在篮球中你会有PG、PF、C等 职业体育{ 公共职能职位() { 返回$this->hasMany(\App\Position::class); } } Position类知道每个扮演该位置的玩家 类位置{ 公共职能体育() { 返回$this->belongsTo(\App\Sport::class); } 公共
职业体育{
公共职能职位()
{
返回$this->hasMany(\App\Position::class);
}
}
Position类知道每个扮演该位置的玩家
类位置{
公共职能体育()
{
返回$this->belongsTo(\App\Sport::class);
}
公共职能扮演者()
{
返回$this->hasMany(\App\Player::class);
}
}
每个球员都可以在一个队中打一个特定的位置
职业玩家{
公共职能职位()
{
返回$this->belongsTo(\App\Position::class);
}
公共职能小组()
{
返回$this->belongsTo(\App\Team::class);
}
}
每支球队都与一项运动直接相关,每个球员都可以在该队中占据一席之地
班级团队{
公共职能体育()
{
返回$this->belongsTo(\App\Sport::class);
}
公共职能扮演者()
{
返回$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();
我觉得可能是这样的
{
"teams": [
{
"id": 1,
"name": "Barcelona",
"positions": [
{
"id": 1,
"name": "Center Forward",
"players": [
{
"id": 1,
"name": "Lionel Messi"
}
]
}
]
}
]
}
Team::with(['players.position'=>function($query){/*insert groupBy magic*/}])->paginate();
有什么想法吗?你应该让你的团队下载其他数据:
$teams->load('sport.positions.players');
注意:在分页函数中使用分页计数作为参数,如下所示:
$teams->load('sport.positions.players')->paginate(5);
您可以尝试以下查询:
$team = Team::with(['players','position'=>function($q){
$q->groupBy('positio_name') ;
})->get();
不完全是你想要的,但这会给你足够近的距离
首先在App\Sport
公共职能团队()
{
返回$this->hasMany(团队::类);
}
这样你就可以免费获得每个队的球员范围,然后你就可以按照他们的位置对每个队的球员进行分组,就像这样
Sport::with(['teams.players.position'])->find($Sport\u id)
->setRelation('teams',$sport->teams->map(函数($teams){
返回$team->setRelation('players',$team->players->groupBy(函数$player){
返回$player->position->name;
}));
}));
setRelation()
将覆盖该关系,而不是向模型实例添加具有该关系名称的属性
希望能有所帮助。尝试定义运动与团队的关系,看看它是否有效团队
和位置
之间没有直接关系。没有关系,很难形成您想要的json。你对json团队->运动->位置->球员-/code>满意吗?@Sandepsudhakaran是的,我完全同意,但当我尝试这样做时,我最终从同一阵列中的所有团队中获得每个位置的球员。由于某种原因,当我用这种方法得到球员时,他们没有机会进入球队。谢谢你的回复。我试过:$this->teams=\App\Team::all()代码>$this->teams=$this->teams->load('sport.positions.players')代码>但这最终会加载(在每个团队对象中)每个位置的所有玩家,而不考虑团队id。基本上,我会在每个团队的同一数组中为不同团队加载玩家。