1

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

我认为 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 = App\Availability::find(1331);
$可用性→计划()→获取();
Illuminate\Database\Eloquent\Collection {#3111
all: [],
}

4

2 回答 2

0

我认为你在 hasOneThrough 上颠倒了你的关系,所以关系应该是:

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

    );
}
于 2020-04-21T16:30:52.807 回答
0

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

我改用了查询构建器:

   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();
 }
于 2020-04-22T08:10:06.470 回答