Laravel Eloquent ORMは、Laravelフレームワークに組み込まれたオブジェクトリレーショナルマッパー(ORM)であり、データベースとのやり取りを、オブジェクト指向のインターフェースを通じて行うことができます。構文がシンプルでクエリ生成、リレーションシップの管理などが簡単にできます。
モデルの作成
以下のコマンドでモデルとデータベースマイグレーションファイルを作成します。モデルは、テーブルの各カラムに対応する属性と、データベース操作を行うメソッドを持っています。
php artisan make:model Share -m
これによってapp/Models/Share.php
とapp/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_at
とupdated_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');