Laravel 5.1的hasManyThrough关系和中间表

10

在我的应用程序中,我有以下模型/表设置;

timesheet

  • user_id

user

  • id

supervisor_user

  • user_id
  • supervisor_id

用户通过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 关系实现...但是不知道该如何编写代码。

我应该如何实现所需功能?

2个回答

7
在您的角色模型中创建一个方法:
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

嗨,感谢您的回复。没有Supervisor模型,因为这个应用程序是基于角色的,我有一个“角色”模型。我在上面忘记提到这一点了。 - V4n1ll4
现在我遇到了这个错误:Undefined property: Illuminate\Database\Eloquent\Collection::$timesheets - V4n1ll4
我的错误,由于多对多的关系,会返回多个用户,因此您必须遍历每一个用户。但是,这应该只返回最后一个(因为我不知道您打算以后如何处理它们)。 - Norgul
当我执行 dd($role->supervisors); 时,它是一个空集合,即使其中有督导。 - V4n1ll4

2

是的,你说得对,你可以使用两种方法实现主管的工时表。一种方法是使用连接查询,即连接多个表并查找工时表;另一种方法是使用hasManyThrough。

简单的方法:因为在主管表中有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,你可能会发现有一种情况是一对多和再次一对多的情况。例如:国家有许多用户,用户有许多帖子。在这种情况下,如果我们使用hasmanythrough,我们可以拉取属于这个国家的帖子。而你需要的是,一个主管有很多用户,一个用户有很多工时记录表。如果我理解错了,请纠正我,我的解决方案基于此,所以我将帮助您获取为特定主管提供的所有工时记录表。简而言之,您将获得所有属于给定主管的用户的所有工作时间表。
public function timesheets()
    {
        return $this->hasManyThrough('App\SupervisorUser', 'App\User');
    }

这里的第一个参数是您想从中获取数据的最终表格。第二个参数是我们经过的中间表格。如果需要,您可以添加第三和第四个参数来获取特定的Id。 现在只需尝试: $supervisor_timesheet = $Supervisor_user->timesheets


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接