我在我的应用程序中设置了以下模型/表格;
时间表
用户
supervisor_user
用户通过supervisor_user
数据透视表“”分配给主管。
我在User
模型上设置了以下关系,它可以获得主管用户。
/**
* The supervisors that are assigned to the user.
*
* @return Object
*/
public function supervisors()
{
return $this->belongsToMany('App\Models\User\User', 'supervisor_user', 'user_id', 'supervisor_id')->withTimestamps();
}
我想设置另一个关系,它会将一个时间表列表“分配”给主管。我猜是hasManyThrough
关系...但不完全是如何为它编写代码。
我如何实现我的需要?
答案 0 :(得分:6)
在您的角色模型中制作方法:
public function users()
{
return $this->belongsToMany('App\Models\User\User',
'supervisor_user', 'supervisor_id', 'user_id')->withTimestamps();
}
在您的用户模型中制作方法:
public function timesheets()
{
return $this->hasMany('App\Timesheet', 'user_id');
}
然后拨打电话:
$supervisorRole = Role::find($id);
foreach($supervisorRole->users as $user)
$timesheets = $user->timesheets;
endforeach
答案 1 :(得分:2)
是的,你是对的,你可以使用两种方法为主管实现时间表。使用连接查询,即连接多个表并查找时间表或使用hasManyThrough。
简单方法:因为你在supervisor表中有user_id,我认为那是属于给定主管的用户。我们可以简单地将supervisor_users.user_id与timesheets.user_id进行比较。
$timesheets = db:table('timesheets')
->join('supervisor_user','timesheets.user_id','=','supervisor_users.user_id')->get();
这应该可以解决问题。如果你需要添加where或select子句,那么在get()之前添加。
更快的方式: 如果你检查laravel文档,对于hasmanythrough,你可能会遇到一对多的情况,也可能是一对多。所以喜欢:国家有很多用户,用户有很多帖子。如果我们这样做,我们可以提取属于国家的帖子。对我来说,我看到的是,一个主管有很多用户,一个用户有很多时间表。如果我错了,请在此纠正我,我的解决方案就是基于此,所以我将帮助您获取给定主管的时间表。缩短属于同一属于给定主管的用户的所有时间表。您将获得给定主管的所有用户的所有时间表。
public function timesheets()
{
return $this->hasManyThrough('App\SupervisorUser', 'App\User');
}
这里的参数一是你想要数据的最终表。论证二是我们经过的中间表。如果您喜欢Id,可以添加第三个和第四个参数。 现在只需尝试: $ supervisor_timesheet = $ Supervisor_user-> timesheets