タイトルの通り、Laravelで外部キー以外でリレーションする方法が知りたいです。
##現状
teachersテーブル
teacher_id,teacher_nameをもつ
studentsテーブル
student_id,student_nameをもつ
categoriesテーブル
category_id,category_code,category_nameをもつ
tagsテーブル
tag_id,tag_code,tag_nameをもつ
カテゴリーとタグの中間テーブル(category_tag)
category_tag_id,teacher_id,student_id,category_code,tag_codeをもつ
中間テーブルのリレーションする際に、外部キーの主キーで行うと思いますが、仕様上teacher_id,student_id,category_code,tag_codでデータを絞り込んでリレーションする必要がでてきました。
なので、外部キー以外でリレーションする方法が知りたいです。
#試したこと
カテゴリーとタグのリレーションはそれぞれのモデルに記載しています。
/** * カテゴリー リレーション */ public function categories() { return $this->belongsToMany( 'App\Models\Category', // 中間テーブルの先のモデル 'category_tag', // 中間テーブル名 'teacher_id', // 中間テーブルの持つ教師ID 'student_id', // 中間テーブルの持つ生徒ID 'category_code', // 中間テーブルの持つカテゴリーコード 'tag_code' // 中間テーブルの持つタグーコード ); }
/** * タグ リレーション */ public function tags() { return $this->belongsToMany( 'App\Models\Pattern', // 中間テーブルの先のモデル 'category_tag', // 中間テーブル名 'teacher_id', // 中間テーブルの持つ教師ID 'student_id', // 中間テーブルの持つ生徒ID 'category_code', // 中間テーブルの持つカテゴリーコード 'tag_code' // 中間テーブルの持つタグーコード ); }
結果:
categoryController.php コントローラ側 $categories = $this->category->findAllByTeacherIdAndStudentIdWithTags($teacherId, $studentId); category.php モデル側 public function findAllByTeacherIdAndStudentIdWithTags($teacherId, $studentId) { // データ取得 $result = $this ->where([ ['teacher_id', '=', $teacherId], ['student_id', '=', $studentId], ]) ->with('tags') ->get(); return $result; }
withを使って、リレーションの情報もまとめて取得しようとしてもリレーションしたデータが取得できない。
(cateogoryの情報のみ取得できるが、リレーションしているタグの情報は取得できない。)
ご教示お願いいたします。