2017-04-03 80 views
0

我在最近几天一直在努力解决问题。我刚开始使用Laravel,并且越来越喜欢Eloquent语法! 但是当我试图获得三种模型之间的正确关系时存在一个问题。Laravel多对多3款

我有这种设置:

节目表中包含

  • 事项标识
  • 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": "[email protected]", 
      "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": "[email protected]", 
      "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": "[email protected]", 
      "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": "[email protected]", 
      "created_at": "2017-03-20 16:45:09", 
      "updated_at": "2017-03-20 16:45:09" 
      } 
     } 
     ] 
    } 
    } 
] 
} 

我不能涉及到海誓山盟的模型 - 它似乎。我希望的首选结果是所有事件都与许多用户绑定 - 并且该事件的所有用户都绑定到一个角色。我如何用Laravel和雄辩来完成这个任务?

感谢您的回复!

编辑: 要提取我使用下面的代码来生成上述

$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

你的关系看起来不错。这可能就是你试图获取不好的数据的方式。你可以发布不适用于你的代码的部分吗? – ettdro

+0

对不起@ettdro - 应该包括在原来的文章。请参阅最新的问题。 –

+0

是不是你到那里?我不确定要真正理解你想要什么?如果我们看看'$ event'返回的是什么,那么你有一个包含2个用户的事件和一个与它们相关联的角色。 – ettdro

回答

1

也许只是试着让它一次一个,并找出返回的内容。

@Fredrik安格尔萌说:

得到它现在的工作,通过使用:

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

+1

你知道你可以做到这一点:'$ events = Event :: with('programs.role','programs.user') - > get();' – fubar

+0

@Fredrik Angell Moe检查了这个清洁代码! – ettdro

+0

已经做了:)注意到,现在修复。 –

0

为2的ID用户仅与事件相关联的3以1 的作用事件2的角色为1.从结果中可以看出, 事件同时具有角色1和2.

您正在使用两个值。一个是用户标识,另一个是事件标识。

Laravel只能在两个模型之间定义实数。这意味着在你查询你正在使用programe_id和event_id。

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

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