Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何加载多个关系并按嵌套关系分组_Php_Laravel - Fatal编程技术网

Php 如何加载多个关系并按嵌套关系分组

Php 如何加载多个关系并按嵌套关系分组,php,laravel,Php,Laravel,在一个体育应用程序中,我想显示一个团队和每个团队中的球员的列表,并根据他们的位置对球员进行分组 下面是如何定义模型关系的 每个位置都与一项运动相关。在足球中你会有CF、ST、GK等,在篮球中你会有PG、PF、C等 职业体育{ 公共职能职位() { 返回$this->hasMany(\App\Position::class); } } Position类知道每个扮演该位置的玩家 类位置{ 公共职能体育() { 返回$this->belongsTo(\App\Sport::class); } 公共

在一个体育应用程序中,我想显示一个团队和每个团队中的球员的列表,并根据他们的位置对球员进行分组

下面是如何定义模型关系的

每个位置都与一项运动相关。在足球中你会有CF、ST、GK等,在篮球中你会有PG、PF、C等

职业体育{
公共职能职位()
{
返回$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。基本上,我会在每个团队的同一数组中为不同团队加载玩家。