Search

検索したいワードを入力してください

2019年04月04日

LaravelのEloquentのリレーションをまとめて紹介

PHPのフレームワークであるLaravelに実装されてあるEloquentを使って、テーブルのリレーション操作ができるようになります。Webアプリケーションを作るとき、登録情報の操作をするケースは多いです。Laravelに含まれる各メソッドを見ていきましょう。

Laravelのリレーションとは

リレーションとは、データベース上で1対1や1対多などの関連性を表します。LaravelのモデルクラスであるEloquentのリレーションとは、Eloquentモデルクラスのメソッドとして定義します。データベースと同じように、クエリ検索をすることができます。

PHPのフレームワークであるLaravelのリレーションを使えるようになると、会員制サービスやブログサイトの作成ができるようになります。

Eloquentのモデルでリレーションを行う

Laravelのアプリケーションはテーブルどうしが関連づけられているケースは多いです。例えば、メールマガジンのユーザー情報やクレジットカードの個人情報などが挙げられます。LaravelのEloquentではそのようなテーブルのデータのリレーションを操作するときに非常に便利です。

PHPを習得した後、Laravelでアプリケーションを作る機会は多いため、LaravelのEloquentを使いこなせると大変便利です。

hasOne/1対1

hasoneメソッドは1対1のリレーションを表現し、例えばあるユーザーとそのユーザーのアドレス情報のリレーションを表現するときに使います。

Laravelではブログサイトを作成したりする形式のアプリケーションが多いため、hasOneは基本形となります。ここでは、userモデルがadressモデルとリレーションを持っていることを定義します。

namespace App
use Illuminate\Database\Eloquent\Model;

そして、定義するクラスではuseしたModelをextendsで利用します。

class User extends Model
{public function address(){return $this -> hasone('App\Address');}}

UserモデルとAddressモデルが1対1の関係です。

belongsTo/1対1

belongsToはhasoneと同じように、1対1を表しますが、hasoneと逆の関係を表します。hasoneでは、userモデルがaddressモデルを持つときを定義しましたが、その逆で、addressモデルがuserモデルに属することを定義することができます。

構文に大きな違いはなく、クラス内でメソッドを定義していきます。

class Address extends Model
{public function user(){return $this->belongsTo('App\User');}}

addressモデルがuserモデルに属することが定義できました。belongsToの1対1では、個人に属する電話番号や住所など1つしか紐づかない個人情報をリレーションで表現する場合に使うことが多いです。

hasMany/1対多

hasManyメソッドは1対多を表現します。1つのモデルが複数のモデルと対応する関係を表します。例えば、ブログサイトで多くの記事管理をする場合などに利用できます。

namespace App;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model
{public $timestamps = false;
protected $primaryKey = "blog_id";
public function articles()
{return $this->hasMany('App\Articles');}}

このように、hasManyで1対多を表すときは、外部キーが必要になります。外部キーとは、関連したテーブル間を連結するための列のことで、データの整合性を保証するために使用します。

belongsTo/多対1

hasManyでは、1対多を表現しましたが、その逆の多対1を表現する場合には、belongsToメソッドを使います。

ブログサイトには複数の記事が管理されていることを、逆の表現で、それぞれの記事がブログサイトに所属していることを表現してみましょう。

namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Articles extends Model
{public function blog(){return $this->belongsTo('App\Models\Blog');}}

このように、Blogモデルに複数のArticlesモデルが関連しているように、ArticlesモデルはBlogモデルに所属していることも表現することができます。

belongsToMany/多対多

多対多を表現するときはbelongsToManyメソッドを使用します。ブログにおいては、複数の記事に対して設定されているカテゴリーなどが当てはまります。

Laravelのアプリケーションで規模感あるものを作るときにはよく使う構造になります。

namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Articles extends Model
{public function category(){return $this->belongsToMany('App\Models\Category');}}

ArticlesモデルがCategoryモデルを複数所持する関係を表現しています。また、return文では必要に応じて外部キーを設定することもできます。

return $this->belongsToMany(
'App\Models\Category',
'articles_category',
'articles_id',
'category_id'
);

中間テーブルや外部キーはreturn文で表現します。

中間テーブルのカラム取得

2つのテーブルを多対多のリレーションで関係付けている場合に、それらを結ぶ中間テーブルのカラムを取得するには、withPivotを使います。

withPivotにカラムのid名を代入することで、そのカラムの情報を取得することが可能です。

ここでは、ブログ記事とカテゴリーのモデルがそれぞれ多対多でリレーションが形成されている場合を想定して操作を行います。

articles_category中間テーブルには、articles_idとcategory_idが設定されていることを前提とします。2つのidのうち、articles_idのカラムを取得します。

use Illuminate\Database\Eloquent\Model;
class Articles extends Model {
public function category()
{return $this->belongsToMany(Category::class)->withPivot('articles_id');}}

withPivotメソッドの引数にカラムidを指定して取得できます。

hasManyThrough()

hasManyThroughメソッドは、中間テーブルを通して直接関連していないテーブルにアクセスするために使用します。

hasManyThrouthメソッドは2つの引数を持ち、第1引数には最終的にアクセスしたいモデルを指定し、第2引数には中間テーブルのモデルを指定します。リレーションのキーを調整したい場合には、第3引数に中間モデルの外部キーを、第4引数には最終的なモデルの外部キーを指定します。

morphMany() / ポリモーフィック

ポリモーフィックとは、あるモデルを1つの関係だけで、複数のモデルに帰属させます。例えば、書籍とペンをコレクションする場合を考えてみましょう。

構造としては、書籍を扱うBookモデルとペンを扱うPenモデルを作り、その中の変数にidとtitleを設定します。idはinteger型で、titleはstring型で定義します。そして、それぞれを収集するCollectionモデルも定義します。

class Collection extends Model
{public function relation(){return $this->morphTo();}}

BookモデルとPenモデルを収集するためのCollectionモデルを定義します。関数relationをBookモデル、Penモデルで呼び出すと処理がされます。

class Book extends Model
{public function collect(){return $this->morphMany('App\Collection', 'relation');}}

class Pen extends Model
{public function collect(){return $this->morphMany('App\Collection', 'relation');}}

このように、BookモデルとPenモデルにおいて、Collectionモデルの処理を引数とすることで書籍とペンをそれぞれ収集する処理を定義することができます。

morphToMany() / 多対多ポリモーフィック

morphToManyメソッドはmorphManyと対照的に多対多のポリモーフィックを表します。先ほどの例では、BookモデルとPenモデルをcollectするCollectionモデルで操作しましたが、さらに別のモデルを加えて操作します。

BookモデルとPenモデルを収集する以外に、書籍とペンを整理するArrangementモデルも定義してそれぞれを整理する処理が可能になります。

Arrangementモデルの定義の方法は、Collectionモデルの定義方法と同様です。BookモデルとPenモデルそれぞれに共通する処理内容であれば、Arrangement以外にも定義することができます。

morphedByMany()

morphedByManyはmorphManyやmorphToManyとは逆に、処理する内容から処理対象のモデルを呼び出す際に使用します。

上記の例では、CollectionモデルやArrangementモデルからそれぞれが関連するBookモデルやPenモデルを取得する場合に用いることになります。

まとめ

PHPのフレームワークLaravelでWebアプリケーションを作るときはデータの操作が重要になります。ブログサイトやユーザー管理アプリケーションなどLaravelで対応できる範囲は広いです。

Laravelにおいて、EloquentではSQLのようにデータのリレーション操作をすることができます。ユーザー情報の管理など利用する場面は多いので、この機会にぜひマスターしてみましょう。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related