PHP
Vim
MySQL
Laravel

[忘備録]laravel5.5 データベースjoin 結合

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

public function posts() {

return $this->hasMany('App\Post');
}


Post.php

public function user() {

return $this->belongsTo('App\User');
}

これで準備は整いました。


②コントローラーから使う

今回はコントローラーで確認用 unction join() という関数を作ります。


Post.php

function join() {

#postsテーブルのuser_idが1のレコードを全て取得
$user = User::find(1);
$posts = $user->posts;

#postテーブルのデータを全て取得
$posts = Post::all();

#上記で取得した「postsテーブルのuser_idが1のレコード」をひとつずつ表示
foreach ($posts as $post) {
echo $post . "<br/>";
}

#上記で取得した「postテーブルのデータ」から結合されたユーザーの名前をひとつずつ表示する。
foreach ($posts as $post) {
echo $post->user->name . "<br/>";
}

}


これで、適当にルート設定をし、うまく表示されていることを確認することができました。

おかしな部分がある場合、指摘していただけるとありがたいです。