Laravel有3个型号,多对多

时间:2017-04-03 23:01:39

标签: php laravel eloquent models

过去几天我一直在努力解决问题。我刚开始使用Laravel并且非常喜欢Eloquent语法! 但是当我试图在三个模型之间找到正确的关系时会出现问题。

我有这个设置:

程序表包含

  • event_id
  • USER_ID
  • ROLE_ID

在我的活动模型中,我有

public function programs(){
    return $this->hasMany(Program::class);
}

在我的用户模型中,我有

public function programs(){
    return $this->hasMany(Program::class);
}

在我的角色模型中,我有

public function programs(){
    return $this->hasMany(Program::class);
}

我的程序模型包含

public function event(){
    return $this->belongsTo(Event::class);
}
public function user(){
    return $this->belongsTo(User::class);
}
public function role(){
    return $this->belongsTo(Role::class);
}

我需要得到以下结果

Events -> Users -> Role

在我的控制器里,我有     $ events = Event :: with('programs.role.programs.user') - > get();

产生这个:

{
"id": 2,
"name": "Concert: Freddy Kalas",
"description": "Freddy Kalas konsert",
"user_id": 2,
"time_from": "12.04.2017 22:00:00",
"time_to": "12.04.2017 23:00:00",
"created_at": "2017-03-20 18:28:44",
"updated_at": "2017-03-20 18:28:44",
"programs": [
  {
      "id": 2,
    "event_id": 2,
    "user_id": 2,
    "role_id": 1,
    "created_at": null,
    "updated_at": null,
    "role": {
      "id": 1,
      "name": "Camera operator",
      "description": "Operates ordinary cameras or PTZ cameras",
      "created_at": "2017-03-20 20:11:06",
      "updated_at": "2017-03-20 20:11:06",
      "programs": [
        {
            "id": 1,
          "event_id": 3,
          "user_id": 2,
          "role_id": 1,
          "created_at": null,
          "updated_at": null,
          "user": {
            "id": 2,
            "name": "Dummy Dum",
            "email": "dummy@example.com",
            "created_at": "2017-03-20 16:45:09",
            "updated_at": "2017-03-20 16:45:09"
          }
        },
        {
            "id": 2,
          "event_id": 2,
          "user_id": 2,
          "role_id": 1,
          "created_at": null,
          "updated_at": null,
          "user": {
            "id": 2,
            "name": "Dummy Dum",
            "email": "dummy@example.com",
            "created_at": "2017-03-20 16:45:09",
            "updated_at": "2017-03-20 16:45:09"
          }
        }
      ]
    }
  }
]
},
{
    "id": 3,
"name": "Prøveproduksjon",
"description": "Prøveproduksjon med video og lyd",
"user_id": 1,
"time_from": "11.04.2017 13:00:00",
"time_to": "11.04.2017 17:00:00",
"created_at": "2017-04-03 17:12:37",
"updated_at": "2017-04-03 17:12:37",
"programs": [
  {
      "id": 1,
    "event_id": 3,
    "user_id": 2,
    "role_id": 1,
    "created_at": null,
    "updated_at": null,
    "role": {
      "id": 1,
      "name": "Camera operator",
      "description": "Operates ordinary cameras or PTZ cameras",
      "created_at": "2017-03-20 20:11:06",
      "updated_at": "2017-03-20 20:11:06",
      "programs": [
        {
            "id": 1,
          "event_id": 3,
          "user_id": 2,
          "role_id": 1,
          "created_at": null,
          "updated_at": null,
          "user": {
            "id": 2,
            "name": "Dummy Dum",
            "email": "dummy@example.com",
            "created_at": "2017-03-20 16:45:09",
            "updated_at": "2017-03-20 16:45:09"
          }
        },
        {
            "id": 2,
          "event_id": 2,
          "user_id": 2,
          "role_id": 1,
          "created_at": null,
          "updated_at": null,
          "user": {
            "id": 2,
            "name": "Dummy Dum",
            "email": "dummy@example.com",
            "created_at": "2017-03-20 16:45:09",
            "updated_at": "2017-03-20 16:45:09"
          }
        }
      ]
    }
  }
]
}

我似乎无法让模型与彼此联系起来。我想要的首选结果是所有事件都与许多用户绑定 - 并且该事件的所有用户都绑定到一个角色。我怎样才能用Laravel和Eloquent来实现这个目标?

感谢您的回复!

编辑: 要获取数据,请使用以下代码生成上面的结果

$events = Event::with('programs.role.programs.user')->get();

节目表的内容

# id, event_id, user_id, role_id, created_at, updated_at
'1', '3', '2', '1', NULL, NULL
'2', '2', '2', '1', NULL, NULL

这意味着ID为2的用户仅与角色为1的事件3和角色为1的事件2相关联。从结果中可以看出,这两个事件都具有角色1和角​​色2。对不起,解释不好..

2 个答案:

答案 0 :(得分:1)

可能只是尝试一次制作一个并找出返回的内容。

@Fredrik Angell Moe说:

使用以下方法让它正常工作:

$events = Event::with('programs.role')->with('programs.user')->get();

答案 1 :(得分:0)

  

ID为2的用户仅与角色为1的事件3相关联   和事件2的角色为1.正如您从结果中看到的那样   事件有角色1和角​​色。

您正在使用两个值。一个是用户的id,第二个是事件的id。

Laravel只能在两个模型之间定义实际情况。这意味着在您查询中您正在使用programe_id和event_id。

但是user_id被忽略了。因此,它只会添加与模型相关的用户,而不是使用user_id进行过滤。

解决此问题的最佳方法是使用原始查询的关系go,您需要获取两个以上模型之间的关系。