雄辩的关系-hasOneThrough关系

时间:2020-04-21 12:50:52

标签: laravel eloquent eloquent-relationship has-one-through

问题
我想使用schedule表中的availability从表中获取shift_id的匹配availabilities
可用性已经是usersshifts之间的数据透视表。

我认为hasOneThrough关系是解决问题的方法,但我似乎无法使其正常工作。
我在做什么错了?

表格

可用性
-id
-user_id
-shift_id
-...

班次
-id
-schedule_id
-...

时间表
-id
-...

可用性模型

 public function schedule()
{
    return $this->hasOneThrough(
        'App\Schedule',
        'App\Shift',
        'schedule_id',
        'id',
        'shift_id',
        'id'
    );
}

问题 不知何故,当我使用PHP Artisan Tinker时,获得的表的ID为Availability.id,而不是ID的表为shift.id。 由于此时间表不存在,我得到了

$ availability =应用\可用性:: find(1331);
$ availability→schedule()→get();
照亮\数据库\口才\集合{#3111
全部:[],
}

2 个答案:

答案 0 :(得分:0)

我认为您在hasOneThrough上颠倒了您的关系,因此该关系应为:

 public function schedule()
{
    return $this->hasOneThrough(
        'App\Shift',
        'App\Schedule',
        'shift_id',
        'schedule_id',

    );
}

答案 1 :(得分:0)

经过大量尝试并检查了生成的sql查询之后,我得出的结论是hasOneThrough不能以这种方式使用。

我改用了一个querybuilder:

   public function schedule()
 {
     return DB::table('schedules')
         ->join('shifts', 'shifts.schedule_id', '=', 'schedules.id')
         ->where('shifts.id', '=', "$this->shift_id")
         ->select('schedules.*', 'shifts.schedule_id')
         ->get();
 }