Laravelのデータベース接続設定を行い、接続確認まで行うことができたら、次にLaravelでMVCのModelを作成していきます。 LaravelではModelはデフォルトで作成されていませんでした。Modelは定義が曖昧なため、各自で作成するスタイルです。 ですが、LaravelではModelとなるO/Rマッパーをフレームワークの一部として含んでいます。今回はLaravelに含まれているEloquentというO/Rマッパーの基礎について学んでいきます。

LaravelのEloquent(ORM)の作成と設定

3年以内に更新されました。情報が古い可能性があります。
更新日 : 2020年02月04日

Laravelのデータベース接続設定を行い、接続確認まで行うことができたら、次にLaravelでMVCのModelを作成していきます。

LaravelではModelはデフォルトで作成されていませんでした。Modelは定義が曖昧なため、各自で作成するスタイルです。

ですが、LaravelではModelとなるO/Rマッパーをフレームワークの一部として含んでいます。今回はLaravelに含まれているEloquentというO/Rマッパーの基礎について学んでいきます。

Eloquentとは

EloquentはLaravelフレームワークに内包されているO/Rマッパーの名称です。

Eloquentを利用することでデータベースアクセスをPHPコードのみで実装することができます。(SQLを書くことができる人に取っては扱いづらい部分もありますが…)

EloquentでのModelの実装方法についてはドキュメントにも記載してありますので、そのドキュメントにならって実装していきたいと思います。

事前準備

まずはデータベースのテーブルを用意しないと始まりません。Laravelのデータベース接続設定で作成したテーブルを利用して、かなり簡易的なModelの作成までを行っていきます。

Eloquentモデルの作成

接続設定ではブログの投稿を想定したテーブルを作成しました。テーブル名をpostsとしたため、postsテーブル用のEloquentモデルを作成していきます。

ArtisanコマンドでModelの作成

ArtisanコマンドでModelを自動生成することができます。以下のコマンドをプロジェクトディレクトリ直下で実行します。

$php artisan make:model Post

コマンドを実行後、Model created successfully.と表示されれば成功です。

実行すると、appディレクトリ配下にPost.phpが自動生成されているはずです。デフォルトでappディレクトリに自動生成されますが、Model関係のPHPファイルをまとめておきたい場合には以下のように実行することもできます。

$php artisan make:model Models/Post

こうすることでapp/Modelsディレクトリ配下にPost.phpが自動生成されます。

作成されたModelの確認

自動生成されたModelのPHPファイルを見てみましょう。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
}

namespaceはModel作成コマンドに応じてApp\ModelsAppとなっているはずです。

また、use Illuminate\Database\Eloquent\Model;となっています。これはLaravelフレームワークのEloquentモデルを利用する宣言です。

作成されたPostクラスはModelクラスを拡張しています。これは上記のEloquentモデルのことです。

Eloquentモデルの規約

Eloquentモデルは自動でテーブルに接続し、適切にメソッドを実行することによってレコードの操作を行うことができます。

例えば、今回作成したPostモデルであればPost.phpとしてPost(アッパーキャメルケース)というクラス名でモデルを作成しました。このようにすることにより、Eloquentモデルが自動的にデータベース上のposts(スネークケース複数形)という名前のテーブル名に接続する設定になります。

他にもEloquentモデル上の規約がいくつかあるので、下記で説明します。

テーブル名

先程の例で説明したとおり、クラス名をスネークケースの複数形にしたものがテーブル名として自動的に利用されます。

このテーブル名を変更したい場合には下記のようにコードに一部変更を加えます。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // テーブル名の任意設定
    protected $table = 'admin_posts';
}

このようにメンバー変数を定義して値を代入しておくことで、Postクラスはadmin_postsというテーブルに接続する設定になります。Eloquentの継承元であるModelクラスがこの$table変数の設定を反映した上で接続してくれます。

主キー

Eloquentモデルは主キーをデフォルトでidというカラム名と想定して接続します。

主キーのカラム名が異なる場合には以下のように設定することで設定を上書きできます。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // 主キーカラムの任意設定
    protected $primaryKey = 'post_id';
}

これで主キーをpost_idとして認識してくれます。

さらに主キーはInt型(整数型)でauto_incrementを付与していることがほとんどなので、Eloquentではそれも自動で設定されています。

異なる型や設定をテーブルに付与している場合にはEloquentモデルにその変更も反映しておく必要があります。詳細はドキュメントの主キーという項目を読んでください。

タイムスタンプ

データベースを扱う際、テーブルのカラム定義にはレコードの作成日時と更新日時を入れる場合が多いです。主にcreated_atupdated_atというカラム名をDatetime型で定義することが多くあります。

Eloquentモデルにはこの作成日時と更新日時を自動更新する機能も存在します。デフォルトでcreated_atupdated_atに自動更新する設定になっています。これらの設定を上書きする場合には以下のようにプロパティや定数を定義しておきます。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // タイムスタンプの自動更新設定
    // falseで自動更新しない(デフォルトtrue)
    public $timestamps = false;

    // カラム名の設定上書き
    const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'last_update';
}

このようにすることでカラム名の設定や自動更新設定を上書きできます。

論理削除

テーブルに論理削除用のカラムを設定したい場合には、Eloquentモデルで論理削除機能を付与できます。論理削除についてはMySQLのレコード削除の記事を参照してください。

カラム名はデフォルトでdeleted_atを想定しています。こちらは設定を上書きすることができます。

論理削除機能を付与したい場合にはコードに以下を追記します。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
// こちらも忘れずに
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    // 論理削除機能を追加する設定
    use SoftDeletes;

    // カラム名の設定上書き
    const DELETED_AT = 'deleted';
}

論理削除や物理削除の使い分けなどについてはドキュメントのソフトデリートの項目を読んでください。

以上で大体のモデルの設定項目は扱うことができます。

すべてクラス内変数(プロパティ)の上書きを行うだけで自動的にEloquentモデルに設定が反映され、変更された値に適切に変換されてデータベースにアクセスされます。

適宜自分が扱うテーブルの設定に合わせて実装を追加しましょう。

また、これらの設定はモデルクラス内のなるべく上の方に定義し、他の開発者が設定値を読みやすい状態にしておくことが望ましいです。