のリレーションテーブルで、親を指定したら全ての孫レコードを取得

laravelの親・子・孫のリレーションテーブルで、親を指定したら全ての孫レコードを取得できるhasManyThroughの第5・6引数が分かりづらい!

laravelの親・子・孫のリレーションテーブルで、親を指定したら全ての孫レコードを取得できるhasManyThroughの第5・6引数が分かりづらい!

参考URL:
https://mintaku-blog.net/laravel-hasmanythrough/

参考URL:

リレーションキーがお作法通りなら簡単!
Parentテーブル(idのみで外部キーなし)
Childテーブル(parent_idが外部キー)
GrandChildテーブル(child_idが外部キー)

 
public function 全孫取得()
{
    return $this->hasManyThrough(
        'App\GrandChild', // 孫モデル
        'App\Parent'   // 子モデル     
    )->orderBy('created_at');
} 

URLにインクリメントされた単純なidとかは嫌だ!という時にはハッシュ値をキーとして使ったりできる(らしい)

// ユニークIDを生成
$parent_unique_id = hash(“sha256”, uniqid(rand(), true));

Parentテーブル(idのみで外部キーなし)
Childテーブル(parent_unique_idがリレーションキー)
GrandChildテーブル(child_unique_idがリレーションキー)

すると途端にややこしくなる・・・!

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でも、省略せずに書いたら、こんな感じになるはず

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');
 }

元記事:https://www.messiahworks.com/archives/20268

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク