Laravelでjoinを使う方法【初心者向け】

初心者向けにLaravelでjoinを使う方法について解説しています。joinは正規化されたテーブル同士を結合させる時に使用する重要な操作なので覚えておきましょう。実際にソースコードを書いて説明しているので、参考にしてみてください。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Laravelでjoinを使う方法について解説します。

データベースを操作する上で必須の知識なので、ぜひ書き方を理解しておきましょう。

 

なお本記事は、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のプログラミングで挫折しない学習方法を動画で公開中

実際に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 Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = ['title', 'body'];

    public function comments()
    {
        return $this->hasMany('App\Coment');
    }
}

app/Comment.rb

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    protected $fillable = [‘post_id’, ‘body'];

    public function post()
    {
        return $this->belongsTo('App\Post');
    }
}

準備ができたのでphp artisan tinkerで対話環境を開きます。

>>> use App\Post;
>>> Post::create(['title' => 'Eloquent の Model について', 'body' => '1対1のリレーションを定義してみよう'])
=> App\Post {#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
=> Illuminate\Database\Eloquent\Collection {#2854
     all: [],
   }
// まだ紐付いているコメントはありません
>>> $post->comments()->create([ 'body' => 'わかりにくい…’ ])
=> App\Comment {#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' => 'わかりやすい!' ]])
=> Illuminate\Database\Eloquent\Collection {#2843
     all: [
       App\Comment {#2850
         body: ""まあまあ。"",
         post_id: 1,
         updated_at: ""2018-07-23 14:52:30"",
         created_at: ""2018-07-23 14:52:30"",
         id: 2,
       },
       App\Comment {#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 App\Comment;
>>> Comment::all()
=> Illuminate\Database\Eloquent\Collection {#2844
     all: [
       App\Comment {#2836
         id: 1,
         post_id: 1,
         body: ""わかりにくい…”,
         created_at: ""2018-07-23 14:50:09"",
         updated_at: ""2018-07-23 14:50:09"",
       },
       App\Comment {#2849
         id: 2,
         post_id: 1,
         body: ""まあまあ。"",
         created_at: ""2018-07-23 14:52:30"",
         updated_at: ""2018-07-23 14:52:30"",
       },
       App\Comment {#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コースを提供しています。

PHPやフレームワークのLaravelを使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。