Eloquent 关系 - hasOneThrough 关系
Eloquent Relationships - hasOneThrough relation
问题
我想使用 availabilities
table.[=39= 中的 shift_id
从 table 中获取 schedule
的匹配 availability
]
可用性已经是 users
和 shifts
之间的支点 table。
我认为 hasOneThrough 关系是到达这里的方式,但我似乎无法让它工作。
我做错了什么?
表格
可用性
- 编号
- user_id
- shift_id
- ...
班次
- 编号
- schedule_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);
$availability→schedule()→get();
Illuminate\Database\Eloquent\Collection {#3111
all: [],
}
我认为你在 hasOneThrough 上颠倒了你的关系,所以关系应该是:
public function schedule()
{
return $this->hasOneThrough(
'App\Shift',
'App\Schedule',
'shift_id',
'schedule_id',
);
}
经过大量尝试和检查生成的 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();
}
问题
我想使用 availabilities
table.[=39= 中的 shift_id
从 table 中获取 schedule
的匹配 availability
]
可用性已经是 users
和 shifts
之间的支点 table。
我认为 hasOneThrough 关系是到达这里的方式,但我似乎无法让它工作。
我做错了什么?
表格
可用性
- 编号
- user_id
- shift_id
- ...
班次
- 编号
- schedule_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);
$availability→schedule()→get();
Illuminate\Database\Eloquent\Collection {#3111
all: [],
}
我认为你在 hasOneThrough 上颠倒了你的关系,所以关系应该是:
public function schedule()
{
return $this->hasOneThrough(
'App\Shift',
'App\Schedule',
'shift_id',
'schedule_id',
);
}
经过大量尝试和检查生成的 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();
}