オーダーメイドコース
icon
icon

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講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。