Laravel Eloquent ORMは、Laravelフレームワークに組み込まれたオブジェクトリレーショナルマッパー(ORM)であり、データベースとのやり取りを、オブジェクト指向のインターフェースを通じて行うことができます。構文がシンプルでクエリ生成、リレーションシップの管理などが簡単にできます。

モデルの作成

以下のコマンドでモデルとデータベースマイグレーションファイルを作成します。モデルは、テーブルの各カラムに対応する属性と、データベース操作を行うメソッドを持っています。

php artisan make:model Share -m

これによってapp/Models/Share.phpapp/database/migrations/xxxx_create_shares_table.phpという二つのファイルが作成されます。xxxxには日付が入ります。

Share.phpにはほかのモデルとのリレーションシップなどを記述します。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Share extends Model
{
    use HasFactory;

    public function company(): BelongsTo
    {
        return $this->belongsTo(Company::class);
    }
}

テーブルの定義はxxxx_create_shares_table.phpに記述します。

public function up(): void
{
    Schema::create('shares', function (Blueprint $table) {
        $table->id();
        $table->foreignId('company_id')->constrained()->onDelete('cascade');
        $table->date('date');
        $table->unsignedBigInteger('total_shares')->nullable();
        $table->unsignedBigInteger('average_shares')->nullable();
        $table->unsignedBigInteger('treasury_shares')->nullable();
        $table->timestamps();
    });
}

作成したモデルについて以下のように確認することができます。

php artisan mode:show Share

Eloquentモデルの暗黙の約束事(conventions)

テーブルの名前

データベーステーブルの名前はモデル名によって決められます。クラス名の「スネークケース」で複数形にしたものがテーブル名として使用されます。Shareモデルのテーブル名がsharesに、FiscalYearモデルがあればテーブル名がfiscal_yearsとなります。

上記の慣例に従っていない場合は、モデルクラスにおいてテーブル名を指定することができます。

class Share extends Model
{
  protected $table = 'my_table_name';

}

プライマリーキー(Primary Keys)

各モデルに対応するデータベーステーブルに id という名前のプライマリキーカラムが存在するのが約束事です。モデルに protected $primaryKey プロパティを定義することで、別のカラムを指定できます。そのほかに

  • Eloquent はプライマリキーがインクリメントする整数値であると仮定しています。インクリメントしない、または数値ではないプライマリキーを使用する場合は、モデルにpublic $incrementing = falseと設定する必要があります。
  • プライマリキーが整数値でない場合は、protected $keyType = 'string'を指定します。
  • コンポジットプライマリーキーはサポートしていませんが、インデックスとして指定できます。

Timestamps

デフォルトでcreated_atupdated_atコラムが作成されます。必要がない場合は、public $timestamps = false;と指定しましょう。またTimestampsのコラム名とフォーマットもカスタマイズが可能です。

データベースコネクション

Eloquentモデルは、デフォルトのデータベースコネクションを使おうとします。複数のデータベースを使うなど別のデータベースコネクションを指定するときはprotected $connection = 'other-connection';をモデルに付け加えます。データベースマイグレーションファイルのクラスにも追加する必要があります。またデータベースコネクションの定義はconfig/database.phpでします。

$table->foreignId('company_id')->constrained()->onDelete('cascade');の定義は以下のようにします。

 $table->foreign('company_id')->references('id')
        ->on(config('database.connections.mysql.database') . '.companies')
        ->onDelete('cascade');