記載されている内容は2019年04月04日時点のものです。現在の情報と異なる可能性がありますので、ご了承ください。記事に記載されている情報は自己責任でご活用いただき、本記事の内容に関する事項については、専門家等に相談するようにしてください。PHPのフレームワークであるLaravelに実装されてあるEloquentを使って、テーブルのリレーション操作ができるようになります。Webアプリケーションを作るとき、登録情報の操作をするケースは多いです。Laravelに含まれる各メソッドを見ていきましょう。シェアツイートはてブ目次LaravelのリレーションとはEloquentのモデルでリレーションを行うまとめLaravelのリレーションとはリレーションとは、データベース上で1対1や1対多などの関連性を表します。LaravelのモデルクラスであるEloquentのリレーションとは、Eloquentモデルクラスのメソッドとして定義します。データベースと同じように、クエリ検索をすることができます。PHPのフレームワークであるLaravelのリレーションを使えるようになると、会員制サービスやブログサイトの作成ができるようになります。Fre...Eloquentのモデルでリレーションを行うLaravelのアプリケーションはテーブルどうしが関連づけられているケースは多いです。メールマガジンのユーザー情報やクレジットカードの個人情報などが挙げられます。LaravelのEloquentではそのようなテーブルのデータのリレーションを操作するときに非常に便利です。PHPを習得した後、Laravelでアプリケーションを作る機会は多いため、LaravelのEloquentを使いこなせると大変便利です。hasOne/1対1hasoneメソッドは1対1のリレーションを表現し、例えばあるユーザーとそのユーザーのアドレス情報のリレーションを表現するときに使います。Laravelではブログサイトを作成したりする形式のアプリケーションが多いため、hasOneは基本形となります。ここでは、userモデルがadressモデルとリレーションを持っていることを定義します。Illuminate\Database\Eloquent\Model;そして、定義するクラスではuseしたModelをextendsで利用します。hasone('App\Address');}}UserモデルとAddressモデルが1対1の関係です。belongsTo/1対1belongsToはhasoneと同じように、1対1を表しますが、hasoneと逆の関係を表します。hasoneでは、userモデルがaddressモデルを持つときを定義しましたが、その逆で、addressモデルがuserモデルに属することを定義することができます。構文に大きな違いはなく、クラス内でメソッドを定義していきます。$this->belongsTo('App\User');}}addressモデルがuserモデルに属することが定義できました。belongsToの1対1では、個人に属する電話番号や住所など1つしか紐づかない個人情報をリレーションで表現する場合に使うことが多いです。hasMany/1対多hasManyメソッドは1対多を表現します。1つのモデルが複数のモデルと対応する関係を表します。ブログサイトで多くの記事管理をする場合などに利用できます。$this->hasMany('App\Articles');}}このように、hasManyで1対多を表すときは、外部キーが必要になります。外部キーとは、関連したテーブル間を連結するための列のことで、データの整合性を保証するために使用します。belongsTo/多対1hasManyでは、1対多を表現しましたが、その逆の多対1を表現する場合には、belongsToメソッドを使います。ブログサイトには複数の記事が管理されていることを、逆の表現で、それぞれの記事がブログサイトに所属していることを表現してみましょう。$this->belongsTo('App\Models\Blog');}}このように、Blogモデルに複数のArticlesモデルが関連しているように、ArticlesモデルはBlogモデルに所属していることも表現することができます。多対多を表現するときはbelongsToManyメソッドを使用します。ブログにおいては、複数の記事に対して設定されているカテゴリーなどが当てはまります。Laravelのアプリケーションで規模感あるものを作るときにはよく使う構造になります。$this->belongsToMany('App\Models\Category');}}ArticlesモデルがCategoryモデルを複数所持する関係を表現しています。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のカラムを取得します。$this->belongsToMany(Category::class)->withPivot('articles_id');}}withPivotメソッドの引数にカラムidを指定して取得できます。hasManyThrough()hasManyThroughメソッドは、中間テーブルを通して直接関連していないテーブルにアクセスするために使用します。hasManyThrouthメソッドは2つの引数を持ち、第1引数には最終的にアクセスしたいモデルを指定し、第2引数には中間テーブルのモデルを指定します。リレーションのキーを調整したい場合には、第3引数に中間モデルの外部キーを、第4引数には最終的なモデルの外部キーを指定します。ポリモーフィックポリモーフィックとは、あるモデルを1つの関係だけで、複数のモデルに帰属させます。書籍とペンをコレクションする場合を考えてみましょう。構造としては、書籍を扱うBookモデルとペンを扱うPenモデルを作り、その中の変数にidとtitleを設定します。idはinteger型で、titleはstring型で定義します。それぞれを収集するCollectionモデルも定義します。$this->morphTo();}}BookモデルとPenモデルを収集するためのCollectionモデルを定義します。関数relationをBookモデル、Penモデルで呼び出すと処理がされます。'relation');}}このように、BookモデルとPenモデルにおいて、Collectionモデルの処理を引数とすることで書籍とペンをそれぞれ収集する処理を定義することができます。多対多ポリモーフィック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のようにデータのリレーション操作をすることができます。ユーザー情報の管理など利用する場面は多いので、この機会にぜひマスターしてみましょう。file.2:営業マンとして活躍し、海外留学。file.4:独学よりもスクールで。他人と同じことはしない。