mcpField
L
laravel-eloquent

laravel-eloquent

github.com/fusengine開発3462 回インストール2 週間前に更新
リポジトリ

laravel-eloquent について

Laravel 13 Eloquent ORMを扱う開発者向けのリファレンススキルです。モデルメタデータにPHP 8.3 Attributesを使う方法を軸に、リレーション、クエリ、モデルのライフサイクルを解説します。

主な機能

  1. 01PHP Attributesによるモデルメタデータ宣言
  2. 02各種リレーションとイーガーロード
  3. 03スコープ、イベント、ソフトデリート
  4. 04コレクション、シリアライズ、APIリソース
  5. 05トランザクション、ページネーション、バッチ処理
  6. 06クエリデバッグとパフォーマンス指針

活用シーン

  1. 01旧式モデルをLaravel 13向けに移行
  2. 02関連モデルを構築しN+1クエリを防止
  3. 03モデルイベントやソフトデリート、API出力を実装
  4. 04ファクトリーテストの作成とクエリ調整

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fusengine/agents --skill laravel-eloquent

インストール後、Claude Code で/laravel-eloquentを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
accessors-mutators.md
aggregates.md
batch-operations.md
casts.md
collections.md
eager-loading.md
events-observers.md
factories.md
legacy-properties.md
models.md
pagination.md
performance.md
query-debugging.md
relationships-advanced.md
relationships-basic.md
relationships-many-to-many.md
relationships-polymorphic.md
resources.md
scopes.md
serialization.md
soft-deletes.md
transactions.md
references/templates/
EagerLoadingExamples.php.md
Factory.php.md
ModelBasic.php.md
ModelCasts.php.md
ModelRelationships.php.md
Observer.php.md
Resource.php.md

詳細

Laravel 13 Eloquent ORM を対象に、PHP 8.3 Attributes を主要なメタデータの仕組みとして扱います(#[Table]、#[Fillable]、#[Hidden]、#[Visible]、#[Guarded]、#[Appends]、#[Touches]、#[Connection]、#[Refreshes])。下位互換性のための従来のプロパティ相当の設定も含みます。すべてのリレーションシップの種類(基本、多対多、高度なリレーションシップ、ポリモーフィック)、Eager Loading、スコープ、アクセサー/ミューテーター、イベント/オブザーバー、ソフトデリート、コレクション、シリアライズ、ファクトリー、API リソース、トランザクション、ページネーション、集計、バッチ操作、クエリのデバッグ/パフォーマンスも扱います。

Laravel Eloquent ORM(L13 — Attributes 優先)

エージェントのワークフロー(必須)

実装を始める前に、name を指定した Agent 呼び出しをそれぞれ 1 回行い、3 つのエージェントを並列で起動してください。

  1. fuse-ai-pilot:explore-codebase - 既存のモデルと、プロパティと Attributes が混在している箇所を調査します
  2. fuse-ai-pilot:research-expert - Context7 を使って Laravel 13 の Eloquent と Attributes のドキュメントを確認します
  3. mcp__context7__query-docs - Attribute のパターン(#[Fillable]、#[Table]、#[Scope])を検索します

実装後、検証のために fuse-ai-pilot:sniper を実行してください。


概要

Laravel 13 では、Eloquent モデルの主要なメタデータの仕組みとして PHP 8.3 Attributes が採用されています。下位互換性のため、従来のプロパティ($fillable、$hidden、...)も引き続きサポートされていますが、対応する Attribute と併用しないでください。

機能Attribute(L13 の主な方法)従来のプロパティ
テーブル名#[Table('users')]protected $table
一括代入#[Fillable([...])]protected $fillable
非表示/表示#[Hidden([...])] / #[Visible([...])]protected $hidden / $visible
ガード対象#[Guarded([...])] / #[Unguarded]protected $guarded
キャストAttribute なし — casts() メソッドprotected $casts
追加項目#[Appends([...])]protected $appends
タッチ対象#[Touches([...])]protected $touches
接続#[Connection('mysql')]protected $connection
主キー#[Table(key: 'uuid', keyType: 'string', incrementing: false)]$primaryKey / $keyType / $incrementing
タイムスタンプを無効化#[WithoutTimestamps]public $timestamps = false
書き込み後にリフレッシュ(13.33+)#[Refreshes(['slug'])]—

重要なルール

  1. Attributes を信頼できる唯一の情報源にします - 新しいコードでは #[Fillable]、#[Hidden]、#[Table] を使います(キャストは casts() に記述します)
  2. 同じ設定に Attribute とプロパティを併用しないでください(#[Fillable] と $fillable の併用など)
  3. リレーションシップを Eager Load します - with() を使って N+1 クエリを防ぎます
  4. モデル自身の boot()/トレイトの boot*() 内で new static()/new Model() を使わないでください - L13 ではネストしたブートが禁止されているため、LogicException がスローされます
  5. テストではファクトリーを使います - テストデータをハードコードしないでください

アーキテクチャ

app/Models/
├── User.php              # #[Table], #[Fillable], #[Hidden] + casts()
├── Post.php              # #[Connection], #[Appends], relationships
└── Concerns/
    └── HasUuid.php       # Reusable trait

→ templates/ModelBasic.php.md を参照してください


リファレンスガイド

概念
テンプレート
テンプレート使用する場面
ModelBasic.php.md属性ベースのモデル
ModelRelationships.php.mdすべてのリレーションシップタイプ
ModelCasts.php.mdcasts() とアクセサー
Observer.php.md完全なオブザーバー
Factory.php.md状態を持つファクトリー
Resource.php.mdAPI リソース
EagerLoadingExamples.php.mdN+1 の防止

クイックリファレンス

属性ベースのモデル(L13 MAIN)
use Illuminate\Database\Eloquent\Attributes\{Table, Fillable, Hidden};
use Illuminate\Database\Eloquent\Model;

#[Table('users')]
#[Fillable(['name', 'email', 'password'])]
#[Hidden(['password', 'remember_token'])]
final class User extends Model
{
    protected function casts(): array
    {
        return ['email_verified_at' => 'datetime', 'is_admin' => 'boolean'];
    }

    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}
スコープ(属性構文)
#[Scope]
protected function published(Builder $query): void
{
    $query->whereNotNull('published_at');
}
// Usage: Post::published()->get();
Eager Loading
$posts = Post::with('author')->get();  // 2 queries, not N+1
13.x の追加機能
#[Refreshes(['slug'])]            // 13.33+: re-read generated columns after insert/update
final class Post extends Model {}

DB::transaction(function () use ($flight) {
    $flight->refreshForUpdate();  // 13.27+: reload with a FOR UPDATE lock
});

→ レガシーな $fillable / $hidden スタイルについては、legacy-properties.md を参照してください。


ベストプラクティス

すること
  • メタデータは PHP Attributes(#[Table]、#[Fillable]、#[Hidden] など)で宣言します
  • 継承しないモデルクラスには final を指定します
  • with() で Eager Loading します
  • テストではファクトリーを使用します
  • casts() メソッドで日付、配列、列挙型をキャストします(#[Casts] 属性はありません)
しないこと
  • 同じモデルで #[Fillable] と $fillable を混在させる(競合します。信頼できる情報源は1つにしてください)
  • モデル自身の boot()/trait の boot*() 内でモデルをインスタンス化する — L13 は LogicException をスローします
  • ループ内でリレーションシップを遅延ロードする(N+1)
  • 本番環境で #[Unguarded] を使用する
  • アクセサー/ミューテーター内でクエリを実行する
  • ビジネスロジックをモデルに記述する(サービス/アクションを使用してください)

コメント