Красноречивые отношения - отношение hasOneThrough - PullRequest
0 голосов
/ 21 апреля 2020

Вопрос
Я хочу получить соответствие schedule из его таблицы для availability, используя shift_id в таблице availabilities.
Доступность уже сводная таблица между users и shifts.

Я думал, что отношение hasOneThrough - это путь к go, но я не могу заставить его работать.
Что я делаю не так?

Таблицы

Доступность
- идентификатор
- 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, я получаю расписание с идентификатором Availability.id вместо расписания с идентификатором shift.id. Поскольку этот график не существует, я получаю

$ Availability = App \ Availability :: find (1331);
$ Availability → schedule () → get ();
Подсветить \ База данных \ Eloquent \ Collection {# 3111
все: [],
}

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

После долгих попыток и проверки сгенерированных запросов 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();
 }
0 голосов
/ 21 апреля 2020

я думаю, что вы перевернули свое отношение на hasOneThrough, поэтому отношение должно быть:

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

    );
}
...