どうも、えんつかです。
Laravelにて複数テーブルを用いて関連づける動作をリレーションと呼びますが、意図する表示がされず苦しみました。
そこで、注意したいことをまとめましたので、参考にしてください。
Laravelでの初アウトプット時のことでしたので、初学者に役立つと思います。
【Laravel】リレーションが機能しない時に気をつけたいこと【原因】
それでは、いってみましょう
本記事を読むことでわかること
本記事では、以下2点について解説します。
- リレーションを用いる為に注意したい基本的なこと
- リレーション以外の手法
リレーションを用いる為の基本的な設定方法と、リレーション以外にも関連づける方法があります。
そちらを記載していきます。
リレーションを用いる為に注意したい基本的なこと
基本的なことは、大きく3点です。
- 「モデル名」、「モデル内クラス名」、「テーブル名」の大文字/小文字ルールを守る
- 主テーブル(主モデル)と従テーブル(従モデル)それぞれ、リレーションを取る(hasMany, belongsTo)
- 絞り込んだ連想配列の変数をforeachでループさせる
以上の3点です。
かなり基本的な内容となりますが、私はここをすっぽかして行なっていた為、痛い目に会いました。
基礎は大切ですね。
アウトプットを行なっていたからこそ、理解できました。
「モデル名」、「モデル内クラス名」、「テーブル名」の大文字/小文字ルールを守る
まず、モデル名の1文字目は、大文字にしましょう。
モデル内クラス名も同様です。
テーブル名については、小文字として、モデル名の複数系表記にしてあげましょう。
例えば、Likeモデルを作成し、Likeモデルファイル内にclass Likeとし、テーブル名はlikes、といった感じです。
Personモデルの場合は、people テーブルですね。
このように設定することで、Laravelシステム内で自動でモデル/テーブルを認識します。
この設定を正しく行なっていないと、思ってもいない挙動をするので注意です。
主テーブル(主モデル)と従テーブル(従モデル)それぞれ、リレーションを取る(hasMany, belongsTo)
主テーブル、従テーブルの設定を正しく行なってください。
主テーブルは、外部キーと呼ばれる、主テーブルに関連するようなカラムがないテーブルです。
従テーブルは、外部キーをカラムに入れているテーブルです。
例えば誰が、どんな投稿をしたかということを考えた時に、usersテーブルとpostsテーブルを準備したとします。
「誰が」投稿したかわかるようにpostsテーブルには、usersテーブルのユーザーidを紐付ける必要があります。
なので、リレーションを行う為には、postsテーブルに、user_idのようなカラム(外部キー)を作成する必要があります。
なのでここでは、usersテーブルは主テーブルとなります。
postsテーブルは、user_idのようなカラム(外部キー)を作成するので従テーブルとなるといった形です。
絞り込んだ連想配列の変数をforeachでループさせる
絞り込んだデータがCollectionクラスとなる場合は、リスト形式でデータが格納されているので、foreachやwhile文を用いてデータを取り出す必要があります。
デバックすると確認できますので、コントローラー内で以下のコマンドを実行してみてください。
dd($変数);
リレーション以外の手法
whereメソッドを用いてリレーション以外にも関連づけることができます。
例えば、
$item = Post::where(‘post_id’, $prePost)->first();
post_idは、Postモデル内カラムid。
$prePostは、別モデル内カラムid。
こうすることで、モデル間を関連づけ、欲しい情報だけ取得することもできます。
私は、セッションとこの手法を用いて、関連付け表示したいものだけ取得しました。
リレーションとなると、関わる全データを取得してしまうので、限定したい場合はこちらが良いのではないでしょうか。
以上です!
良きプログラミングライフを!