过去几天我一直在努力解决问题。我刚开始使用Laravel并且非常喜欢Eloquent语法! 但是当我试图在三个模型之间找到正确的关系时会出现问题。
我有这个设置:
程序表包含
在我的活动模型中,我有
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。对不起,解释不好..
答案 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,您需要获取两个以上模型之间的关系。