laravelの親・子・孫のリレーションテーブルで、親を指定したら全ての孫レコードを取得できるhasManyThroughの第5・6引数が分かりづらい!
参考URL:
https://mintaku-blog.net/laravel-hasmanythrough/
リレーションキーがお作法通りなら簡単!
Parentテーブル(idのみで外部キーなし)
Childテーブル(parent_idが外部キー)
GrandChildテーブル(child_idが外部キー)
1 2 3 4 5 6 7 |
public function 全孫取得() { return $this->hasManyThrough( 'App\GrandChild', // 孫モデル 'App\Parent' // 子モデル )->orderBy('created_at'); } |
URLにインクリメントされた単純なidとかは嫌だ!という時にはハッシュ値をキーとして使ったりする
1 2 |
// ユニークIDを生成 $parent_unique_id = hash("sha256", uniqid(rand(), true)); |
Parentテーブル(idのみで外部キーなし)
Childテーブル(parent_unique_idがリレーションキー)
GrandChildテーブル(child_unique_idがリレーションキー)
すると途端にややこしくなる・・・!
1 2 3 4 5 6 7 8 9 10 11 12 |
public function 全孫取得() { return $this->hasManyThrough( 'App\GrandChild', // 孫モデル 'App\Parent', // 子モデル 'parent_unique_id', // 子テーブルの親ID(外部キー)。デフォだとparent_id 'child_unique_id', // 孫モデルの子ID(外部キー)。デフォだとchild_id 'parent_unique_id', // 親テーブル(Parentテーブル)のローカルキー。デフォだとid。主キー(id)以外をリレーションキーに使う場合に指定。第三引数と同じ値になるカラム。 'child_unique_id' // 子テーブルのローカルキー。デフォだとid。主キー(id)以外をリレーションキーに使う場合に指定。第四引数と同じ値になるカラム。 //主キー(id)ではなくリレーションに使うキーなので、第四引数と同じになるはず! )->orderBy('created_at'); } |
最初のシンプルなidでも、省略せずに書いたら、こんな感じになるはず!
1 2 3 4 5 6 7 8 9 10 11 12 |
public function 全孫取得() { return $this->hasManyThrough( 'App\GrandChild', // 孫モデル 'App\Parent', // 子モデル 'parent_id', // 子テーブルの親ID(外部キー) 'child_id', // 孫モデルの子ID(外部キー) 'id', // 親テーブル(Parentテーブル)のローカルキー。 'id' // 子テーブルのローカルキー。 //主キー(id)でOKなのは、Child.id = GrandChild.child_idだから )->orderBy('created_at'); } |