Laravel 5.1具有许多关系和数据透视表

时间:2016-04-13 10:47:49

标签: php laravel laravel-5 laravel-5.1

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

时间表

  • USER_ID

用户

  • 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 个答案:

答案 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