Как получить данные о 3 моделях отношений ManyToMany с Laravel? - PullRequest
0 голосов
/ 21 июня 2020

У меня есть 3 таблицы academic_years, classroom, courses, а также сводная таблица academic_year_classroom во многих отношениях с 3 таблицами. Сводная таблица имеет 3 столбца academic_year_id, courses_id, classroom_id.

Academi c год это базовая модель отношений. В году много классных комнат, и в каждом классе для этого года есть много курсов.

//*********ACADEMICYEAR MODEL *************

public function classrooms()
{
  return $this->belongsToMany('App\Model\Setting\Classroom', 'academic_year_classroom);
}


//***********COURS MODEL ********************** //
public function classrooms()
{
  return $this->belongsToMany('App\Model\Setting\Classroom', 'academic_year_classroom');
}


//********CLASSROOM MODEL **************
public function academicyears()
{
  return $this->belongsToMany('App\Model\Setting\AcademicYear');
}

public function courses()
{
  return $this->belongsToMany('App\Model\Setting\Cours', 'academic_year_classroom', 'classroom_id', 'courses_id');
}

Я определил, что сводная таблица выглядит следующим образом:

Schema::create('academic_year_classroom', function (Blueprint $table) {
        $table->id();
        $table->foreignId('academic_year_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
        $table->foreignId('classroom_id')->constrained()->onUpdate('cascade');
        $table->foreignId('courses_id')->constrained()->onUpdate('cascade');
    });

Я могу получить все годы и их классы на каждый год без каких-либо проблем. Я также могу получить курсы на каждый год отдельно. года и курсы, назначенные каждому классу на этот год.

Я пробовал этот return $year = AcademicYear::with('classrooms', 'classrooms.courses')->orderBy('year', 'DESC')->get(['id', 'year', 'active_year']);, он возвращает каждый академический c год со своими классами, но включает курсы этого класса за все годы которые имеют этот класс.

1 Ответ

0 голосов
/ 25 июня 2020

Я смог понять это по пути. Возможно, это не лучший подход, но я меньше всего куда-то меня брал. Если у кого-то есть лучший подход или есть некоторые проблемы с этим подходом, пожалуйста, поделитесь им здесь.

//1. I was able to return the records for a single year with it classrooms and courses assigned to that classroom as follow:

public function show($id)
{
  return $year = AcademicYear::with(['classrooms', 'classrooms.faculty', 'classrooms.courses' => function ($q) use($id) {
    $q->where('academic_year_id', $id);
  }])->findOrFail($id);
}

Я также смог вернуть список всех лет с классами для каждого год и курсы, которые были назначены для каждой из классных комнат, следующим образом:

   public function index()
  {
   // First I retrieve all the Year IDs as an array
    $yearID = AcademicYear::pluck('id')->toArray();

    foreach($yearID as $yr) {
      $year = AcademicYear::with(['classrooms', 'classrooms.courses' => function ($q) use($yr) {
        $q->whereIn('academic_year_id', [$yr]);
      }])->orderBy('year', 'DESC')->get();
    }
      return $year;
  }

Опять же, если у вас есть лучший способ подойти к этому, пожалуйста, поделитесь с нами. И если этот ответ был полезен, проголосуйте за него, чтобы он помог другим. Спасибо.

...