【Laravel】EloquentORM リレーションの基礎

こんにちは。今回はEloquentORMを使う上で欠かすことの出来ないリレーションについて解説していきます。

リレーションとは

リレーションとは関連するモデルを取得するための機能です。簡単なサンプルを元に説明します。

ブログ記事を表現するモデルPostがあるとします。

idtitle(記事の表題)content(記事の本文)user_id
1 Eloquentの使い方EloquentはLaravelに搭載されている
ORMです。〜
1
Postsテーブル

著者を表すUsersテーブルがあるとします。

idname
1joe
2bob
Usersテーブル

PostsとUsersテーブルは関係しており、Postsのuser_idとUsersのidで関連付けることができます。

このような場合、それぞれのテーブルに対応したEloquentモデル作成し、モデル同士を関連付けることによって、関連するテーブルのデータを容易に取得することができます。

Eloquentモデルを作成する

まずはEloquentモデルを作成します。UserとPostモデルをartisan make:modelコマンドで作成しましょう。app/Modelsフォルダにモデルが作成されます。(バージョン7以前はapp配下に作られます。)

php artisan make:model User
php artisan make:model Post

今回はPostをメインのモデルとして取得し著者名を関連するUserモデルから取得したいと思います。Userとのリレーションを張るためにPostモデルを編集します。

Postモデルにuserメソッドを作ります。PostはUserモデルとN対1の関係にあります。著者(User)が複数の記事(Post)を投稿するからです。それによってPostはUserに所属するという関係が成り立ちます。PostがUserに所属するのでPostクラスでbelongsTo(User::class)を実行すると関連するUserが1件取得できます。

use App\Models\User;	   

 /**
     * 記事に関連しているユーザーの取得
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

リレーションが定義できたら実際にPostからUserモデルが取得できるか確認してみましょう。tinkerを使って実行します。Postをfindで1件取得し、先程定義したuserを呼び出します。すると関連するUserモデルが取得できます。

>>> App\Models\Post::find(1)->user;
=> App\Models\User {#4133
     id: "1",
     name: "joe",
   }

まとめ

いかがでしょうか。関連するモデルをリレーションを使用して取得する方法を解説しました。今回紹介したbelongsTo以外にも、様々なリレーションのメソッドが存在します。参考で紹介している公式ドキュメントのページを一読することをオススメします。

参考

Laravel公式:リレーション https://readouble.com/laravel/8.x/ja/eloquent-relationships.html

Laravel

Posted by kobainmac