【问题标题】:Laravel 5.1 hasManyThrough relationships and pivot tableLaravel 5.1 hasManyThrough 关系和数据透视表
【发布时间】:2016-08-04 09:52:35
【问题描述】:

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

时间表

  • 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 的关系......但不完全是如何为它编写代码。

我怎样才能达到我的需要?

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.1


    【解决方案1】:

    在你的角色模型中创建一个方法:

    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 模型,因为该应用程序是基于角色的,而我有一个role 模型。我忘了在上面提到这一点。
    • 现在我得到这个错误:Undefined property: Illuminate\Database\Eloquent\Collection::$timesheets
    • 我的错,由于多对多的关系,返回了几个用户,所以你必须遍历每个用户。但是,这应该只返回最后一个(因为我不知道你以后打算用它们做什么)
    • 当我 dd($role->supervisors); 时,即使那里有主管,它也是一个空集合。
    【解决方案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');
        }
    

    这里的参数 1 是您希望从中获取数据的最终表格。参数二是我们通过的中间表。如果您喜欢 Id,可以添加第三个和第四个参数。 现在只需尝试: $supervisor_timesheet = $Supervisor_user->时间表

    【讨论】:

      猜你喜欢
      • 2015-09-10
      • 2019-04-17
      • 1970-01-01
      • 2016-09-04
      • 2021-08-24
      • 2015-12-14
      • 2013-11-17
      • 2014-09-29
      • 2017-07-22
      相关资源
      最近更新 更多