laravelを用いて初めてデータベースの結合をしてみると、想像以上に簡単だったので、忘備録として残しておこうと思う。
前提
データベースにlaravelデフォルトの users
に加え、 id
, uesr_id
, text
カラムを含む posts
テーブルを用意する。
postsテーブルを作成する際はマイグレーションファイルで user_id
カラムを次のように設定する。
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
流れ
①モデル設定
②コントローラーから使う
①モデル設定
今回はユーザーが複数のpostを持つというで、以下のような関係になります。
user has many posts
posts belongs to user
この点を踏まえて、 User.php
, Post.php
に以下のコードを追記。
User.php
publicfunctionposts(){return$this->hasMany('App\Post');}
Post.php
publicfunctionuser(){return$this->belongsTo('App\User');}
これで準備は整いました。
②コントローラーから使う
今回はコントローラーで確認用 unction join()
という関数を作ります。
Post.php
functionjoin(){#postsテーブルのuser_idが1のレコードを全て取得$user=User::find(1);$posts=$user->posts;#postテーブルのデータを全て取得$posts=Post::all();#上記で取得した「postsテーブルのuser_idが1のレコード」をひとつずつ表示foreach($postsas$post){echo$post."<br/>";}#上記で取得した「postテーブルのデータ」から結合されたユーザーの名前をひとつずつ表示する。foreach($postsas$post){echo$post->user->name."<br/>";}}
これで、適当にルート設定をし、うまく表示されていることを確認することができました。
おかしな部分がある場合、指摘していただけるとありがたいです。