Laravelでjoinを使う方法【初心者向け】
初心者向けにLaravelでjoinを使う方法について解説しています。joinは正規化されたテーブル同士を結合させる時に使用する重要な操作なので覚えておきましょう。実際にソースコードを書いて説明しているので、参考にしてみてください。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Laravelでjoinを使う方法について解説します。
データベースを操作する上で必須の知識なので、ぜひ書き方を理解しておきましょう。
そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。
なお本記事は、TechAcademyのオンラインブートキャンプPHP/Laravel講座の内容をもとに紹介しています。
今回は、Laravelに関する内容だね!
どういう内容でしょうか?
Laravelでjoinを使う方法について詳しく説明していくね!
お願いします!
テーブルのjoinとは
データベースを操作するソフトウェアのなかにはテーブル単位で整理されたデータ、テーブル間の関連(繋がり)、を操作するための様々な手段が提供されているものがあります。
これをリレーショナルデータベースマネージメントシステムといい、Laravelでもよく使われるmysqlなどはこれに当たるかと思います。
joinとは、テーブル同士を関連させて取得するためのSQL構文で、
SELECT posts.id, comments.id FROM posts JOIN comments ON posts.id = comments.post_id;
のように、postsのレコードを取得する際に、postsのidの値をpost_idとして持っているcommentsのレコードと一緒に取得してくることができます。(関連のつけ方はキー (ここでは各idカラム) による方法に限りません、またjoinに関しても種類があります)
Laravelのmodelの書き方
Laravelではテーブルに対応したModelを定義し、関連を明示することで上記のようなデータをうまく扱うことができます。(ここはModelとして、Laravel標準のORM、Eloquentを使います)
関連の種類は、1対1、1対多、多対多、hasManyThrough、その他ポリモーフィック関係など構文が使用できます。
- hasMany: テーブルのレコードに対して、関連テーブルの複数のレコードが紐付ける
- belongsTo: テーブルのレコードに対して、関連テーブルの1つのレコードが紐付ける
- belongsToMany: テーブルの複数のレコードに対して、関連テーブルの複数のレコードを紐付ける (両テーブルとbelongsTo関係にある中間テーブルを介する)
- hasManyThrough: テーブルのレコードに対して、関連テーブルの複数のレコードを紐付ける (hasManyとの違いは、大元のテーブルとbelongsTo関係に、関連テーブルとhasMany関係にある中間テーブルを介する)
[PR] PHPを学んで未経験からWebエンジニアを目指す方法とは
実際にLaravelでテーブルを結合させてみよう
テーブルの構造は以下のようになっているとしましょう。
* posts * title: string * body: text * comments * post_id: integer * body: text
これは典型的な post hasMany comments、 comments belongsTo post な関係です。Post、Commentモデルの定義を行います。それぞれ以下のようになります。
app/Post.rb
<?php namespace App; use IlluminateDatabaseEloquentModel; class Post extends Model { protected $fillable = ['title', 'body']; public function comments() { return $this->hasMany('AppComent'); } }
app/Comment.rb
<?php namespace App; use IlluminateDatabaseEloquentModel; class Comment extends Model { protected $fillable = [‘post_id’, ‘body']; public function post() { return $this->belongsTo('AppPost'); } }
準備ができたのでphp artisan tinkerで対話環境を開きます。
>>> use AppPost; >>> Post::create(['title' => 'Eloquent の Model について', 'body' => '1対1のリレーションを定義してみよう']) => AppPost {#2840 title: ""Eloquent の Model について"", body: ""1対1のリレーションを定義してみよう"", updated_at: ""2018-07-23 14:41:47"", created_at: ""2018-07-23 14:41:47"", id: 1, } // 新しい投稿を作成しました >>> $post->comments => IlluminateDatabaseEloquentCollection {#2854 all: [], } // まだ紐付いているコメントはありません >>> $post->comments()->create([ 'body' => 'わかりにくい…’ ]) => AppComment {#2843 body: ""わかりにくい…”, post_id: 1, updated_at: ""2018-07-23 14:50:09"", created_at: ""2018-07-23 14:50:09"", id: 1, } // comments() によって関連を取得することで、create メソッドによってコメントの作成ができました >>> $post->comments()->createMany([[ 'body' => 'まあまあ。' ], [ 'body' => 'わかりやすい!' ]]) => IlluminateDatabaseEloquentCollection {#2843 all: [ AppComment {#2850 body: ""まあまあ。"", post_id: 1, updated_at: ""2018-07-23 14:52:30"", created_at: ""2018-07-23 14:52:30"", id: 2, }, AppComment {#2855 body: ""わかりやすい!"", post_id: 1, updated_at: ""2018-07-23 14:52:31"", created_at: ""2018-07-23 14:52:31"", id: 3, }, ], } // createMany によって複数のコメントを一気に登録することもできます >>> use AppComment; >>> Comment::all() => IlluminateDatabaseEloquentCollection {#2844 all: [ AppComment {#2836 id: 1, post_id: 1, body: ""わかりにくい…”, created_at: ""2018-07-23 14:50:09"", updated_at: ""2018-07-23 14:50:09"", }, AppComment {#2849 id: 2, post_id: 1, body: ""まあまあ。"", created_at: ""2018-07-23 14:52:30"", updated_at: ""2018-07-23 14:52:30"", }, AppComment {#2867 id: 3, post_id: 1, body: ""わかりやすい!"", created_at: ""2018-07-23 14:52:31"", updated_at: ""2018-07-23 14:52:31"", }, ], } // コメントが 3つ登録された事がわかりました!
モデル同士の関連付けに関して説明しました。関連を定義した後はcreateだけでなく様々な便利メソッドが使用できるのでぜひ調べて使ってみてください。
この記事を監修してくれた方
鵜澤峻平(うさわしゅんぺい) 普現在はフリーランスのエンジニアをしていてプログラミング歴は5年目になります。普段は Rails、Laravel、Node.js等を使ってWeb、モバイルアプリケーションを作成しています。開発実績としては、いくつかのWebサービス、コンシューマー向けモバイルアプリケーション、NPO サイトリニューアル、ロボット用プログラムなどがあります。 TechAcademyでメンターをはじめたのは、「プログラミングでやりたいことがある人を応援したい」、「講師と受講者が話し合って学び方を決めていく」に惹かれたからです。 |
内容分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
TechAcademyでは、初心者でもPHPやフレームワークのLaravelを使ってWebアプリケーション開発を習得できるオンラインブートキャンプPHP/Laravel講座を開催しています。
挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。