hasManyでリレーション構築【初心者のためのLaravel超入門講座8】

Laravel 入門講座

Laravel超入門講座8の今回は、1対多のリレーションを作るhasManyメソッドを解説します。

記事に書いてあるとおりの手順で実践してみると、リレーションが作れるようになります。

前回までの講座はこちらをどうぞ。

hasManyでリレーション構築

hasManyメソッドは、テーブル間で1対多の関係を構築するときに使います。

たとえば部署と従業員の関係など。

ひとつの部署には複数の従業員が所属しています。

部署と従業員の関係

データベース上では、部署名を入れたdivisionテーブルと、従業員情報を入れたuserテーブルを作成し、hasManyのリレーションを定義するとよいでしょう。

ふたつのテーブルは、division_idを介して連携させることができます。

hasManyメソッドを使ったリレーションを実践

それでは実際にLaravel上でhasManyメソッドでリレーションを作っていきます。

①Divisionモデルとマイグレーションファイルを作成する

Divisionモデルとマイグレーションファイルを新たに作成します。

次のようにコマンドを入力します。

②divisionのマイグレーションファイルを編集する

作成したマイグレーションファイルは、database/migrationsの中にあります。

ファイルを開き、部署名用のカラム name を追加しましょう。

追加後のマイグレーションファイルは、次のようになります。

保存して、マイグレートを実行します。

③MySQLにデータを追加しておく

MySQLにログインし、divisionテーブルができたことを確認してください。

【挿入】ボタンを押します。

下記のように部署データを追加しておきましょう。

下記では「sales」と入力しています。

なおtinkerというコマンドを使うと、MySQL上ではなく、コマンド入力でデータを追加・編集できます。興味があれば、こちらの記事を参考にデータを追加してみてください。

④userテーブルにdivision_idを追加する

次にuserテーブルにdivision_idのカラムを追加します。

次のようにコマンドを入力します。

database/migrations の中にマイグレーションファイルができています。

funciton up () に次のように入力します。

function down() には、up()に書いた内容を打ち消すとき用のコードを書きます。

こうしておけば、ロールバックしたときにきれいに戻せます。

入力後のファイルは次のようになります。

⑤Divisionモデルにリレーションを追加する

Divisionモデルを編集して、リレーションを追加します。

appフォルダのDivision.phpファイルを開きます。

最後の波カッコ【 }】の前に、下記を加えてください。

コードの意味
このモデル(ディビジョンモデル)は、ユーザーモデル(App\User)とhasManyの関係にあります。

これで、DivisionモデルからUserモデルを呼び出せるようになりました。

注意点として、カラム名を変えたりする場合は、コードの書き方が少し変わります。

こちらの記事にまとめてあるので、気になる方だけ読んでください。

⑥リレーションを確認してみる

それでは実際にリレーションがどう動作するか見てみます。

routesフォルダの中のweb.phpというルートファイルを開きます。

ひとことメモ
本来ならコントローラファイルとビューファイルを使用しますが、いまは実験なのでルートファイルに表示用のコードを記述します。

Divisionモデルを名前空間を省略して呼び出せるように、 use 文が書かれているかチェックします。

もしなければ、書き加えてください。

次に、下記のコードを追加します。

コードの意味

  • /division ページにアクセスしたら、function() { } の命令を実行します。
  • divisionテーブルの id = 1 のレコードを読み出して、$division に代入(保管)します。
  •  foreach文で、$division に属しているユーザたちを一人ずつ $user に代入して {} 内の処理をします。

⑦ページを表示してみよう

Laravelのサーバーを起動して、ページを確認してみてください。

ブラウザを開き、デフォルトのページのURLに 【/division】と加えます。

division番号が1番のユーザーの名前が表示されていれば成功!

なお、上記の表示を行うためのMySQL上のデータは次のようになっています。

divisionテーブルのid情報が、userテーブルのdivision_idに紐づいています。

divisionテーブルのid番号1番は、ユーザーテーブルに2名います。

この2名の名前が、ブラウザーに表示されています。

⑧逆のリレーションはbelongsToを使う

なお、users→divisionへ逆のリレーションを貼るには、blongsToメソッドを使います。

Userのモデルファイルに、下記のように入力します。

さいごに

  • 1対多でテーブルをつなぐ関数にはhasManyメソッドがある
  • 部署名と従業員をつなぐときなどに使える
  • 主となる側(部署名)のモデルにhasManyメソッドを入力する

データベースとリレーションの作り方が分かると、発想が変わってきます。

少し応用編になりますが、リレーションを使って中間テーブルを作る方法を解説した記事もあるので、併せて参考にしてください。

 

コメント

タイトルとURLをコピーしました