【Laravel】リレーションが機能しない時に気をつけたいこと【原因】

プログラミング

【Laravel】リレーションが機能しない時に 気をつけたいこと【原因】

どうも、えんつかです。

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。

こうすることで、モデル間を関連づけ、欲しい情報だけ取得することもできます。

私は、セッションとこの手法を用いて、関連付け表示したいものだけ取得しました。

リレーションとなると、関わる全データを取得してしまうので、限定したい場合はこちらが良いのではないでしょうか。

以上です!

良きプログラミングライフを!