mcpField
L
laravel-eloquent

laravel-eloquent

github.com/fusengineデータ・データベース3462 回インストール1 日前に更新
リポジトリ

laravel-eloquent について

Laravel 13 Eloquent ORM を使う PHP アプリケーション開発者向けのリファレンススキルです。モデルのメタデータには PHP 8.3 Attributes を中心に使い、リレーション、クエリ、シリアライズ、テスト、性能を扱います。

主な機能

  1. 01PHP Attributes によるモデルメタデータ
  2. 02リレーションと Eager Loading
  3. 03スコープ、イベント、アクセサー
  4. 04ファクトリー、リソース、シリアライズ
  5. 05トランザクションとクエリ性能

活用シーン

  1. 01Laravel 13 Eloquent モデルの定義
  2. 02N+1 クエリを避ける関連データの読み込み
  3. 03API リソースとモデルファクトリーの作成
  4. 04クエリのデバッグと性能改善

インストール

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

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

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

詳細

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] を使用する
  • アクセサー/ミューテーター内でクエリを実行する
  • ビジネスロジックをモデルに記述する(サービス/アクションを使用してください)

コメント