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関係にある中間テーブルを介する)
1時間でできる無料体験!

 

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

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

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

プログラミングを独学で学習していて、このように感じた経験はないでしょうか?

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、マンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう カウンセラーやエンジニア・デザイナー があなたの相談に真摯に向き合います。

「自分に合っているか診断してほしい」
「漠然としているが話を聞いてみたい」

こんなささいな悩みでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

今なら参加者限定の割引特典付き! 無料相談を予約する