Laravel через модельные отношения - PullRequest
0 голосов
/ 16 марта 2020

У меня есть 3 таблицы с этим заказом:

  1. Школа it has -> id
  2. SchoolSemester it has -> school_id
  3. SemesterClass it has -> semester_id

Теперь я пытаюсь установить связь между School и SemesterClass, чтобы получить список классов каждой школы, а также названия школ в каждом классе.

на основе документации У меня есть такие отношения:

модель школы

class School extends Model
{
    public function semesters() {
        return $this->hasMany(SchoolSemester::class);
    }

    public function classes() {
        return $this->hasManyThrough(SemesterClass::class, SchoolSemester::class);
    }
}

Модель SchoolSemester

class SchoolSemester extends Model
{
    public function school() {
        return $this->belongsTo(School::class);
    }

    public function classes() {
        return $this->hasMany(SemesterClass::class, 'semester_id', 'id');
    }
}

Модель SemesterClass

class SemesterClass extends Model
{
    public function school() {
        return $this->hasOneThrough(School::class, SchoolSemester::class, 'school_id', 'id');
    }

    public function semester() {
        return $this->belongsTo(SchoolSemester::class, 'semester_id', 'id');
    }
}

Контроллер

public function show($id)
{
    $class = SemesterClass::with(['school', 'teacher', 'teacher.user', 'students'])->findOrFail($id);
    dd($class);
    //return view('admin.Classes.show', compact('class'));
}

Результаты

one

Есть идеи?

1 Ответ

0 голосов
/ 16 марта 2020

Ваша промежуточная таблица: school_semester, laravel найдет по умолчанию Foreign_key school_semester_id, однако, ваш ключ Foreign_key равен semester_id, поэтому вам необходимо указать ключ_языка в hasManyThrough :

    public function classes() {
        return $this->hasManyThrough(
            SemesterClass::class, 
            SchoolSemester::class
            'school_id', // Foreign key on school_semesters table...
            'semester_id', // Foreign key on classes table...
            'id', // Local key on schools table...
            'id' // Local key on school_semesters table...
        );
     }

И измените свой hasOneThrough код следующим образом:

 public function school() {
        return $this->hasOneThrough(
             School::class, 
             SchoolSemester::class, 
             'id',
             'id',
             'semester_id',
             'school_id' );
    }

Другое решение:

Поскольку обратное является просто объединением двух отношений BelongsTo, так что вы можете просто указать belongsTo в SchoolSemester и School Model. И получите отношения следующим образом:

SemesterClass::with(['semester.school'])

Или вы можете определить мутатор в SemesterClass Model:

protected $appends = ['school'];

public function getSchoolAttribute() {
    return $this->semester->school;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...