【Laravel】Eloquentモデルのインスタンスメソッドと静的メソッドの呼び出し方【ORM】

PHP
この記事は約5分で読めます。

この記事の最終更新日: 2023年11月19日

LaravelのEloquent ORMは、データベース操作を効率的で直感的に行うためのツールを提供します。その中心にあるのがEloquentモデルで、静的メソッドとインスタンスメソッドを通じてデータベースのテーブルとのやり取りを可能にします。

静的メソッド

静的メソッドは、クラスレベルでデータベースとのやり取りを行うためのメソッドです。これらは、モデルのインスタンスを生成せずに直接クラスに対して呼び出されます。

主な静的メソッドと用途

find: 特定のIDを持つレコードを取得

$user = User::find(1);

all: テーブル内のすべてのレコードを取得

$users = User::all();

where: 条件に基づいてレコードを検索

$activeUsers = User::where('active', 1)->get();

インスタンスメソッド

インスタンスメソッドは、特定のモデルインスタンスに対して操作を行います。これらは、個々のレコードの操作や、モデル間のリレーションシップの管理に使用されます。

主なインスタンスメソッドと用途

save: モデルの新しいインスタンスを保存または更新

$user = new User();
$user->name = 'John Doe';
$user->save();

delete: モデルインスタンスに関連付けられたレコードを削除

$user = User::find(1);
$user->delete();

リレーションシップの呼び出し方

リレーションシップはインスタンスメソッドを通じて定義されますが、その呼び出し方は少し異なります。

プロパティアクセス: リレーションシップをプロパティとしてアクセスすると、関連するモデルのインスタンスまたはコレクションが返されます。

$posts = $user->posts;

メソッドチェーン: リレーションシップのメソッドをチェーンして、さらにクエリを構築できます。

$recentPosts = $user->posts()->where('created_at', '>', now()->subDays(7))->get();

リレーションシップの定義

リレーションシップはモデル間の関連を表すためにEloquentモデルで定義されます。これらの定義は、データベースのテーブル間の関係を反映しています。

hasOne / hasMany: 一対一または一対多のリレーションシップ

public function profile() {
    return $this->hasOne(Profile::class);
}
public function posts() {
    return $this->hasMany(Post::class);
}

belongsTo / belongsToMany: 多対一または多対多のリレーションシップ

public function user() {
    return $this->belongsTo(User::class);
}
public function roles() {
    return $this->belongsToMany(Role::class);
}

このように、Eloquentモデルの静的メソッドとインスタンスメソッドは、データベース操作の中心であり、リレーションシップの定義と呼び出しは、モデル間の関連を扱うための重要な部分です。これらの機能を理解し活用することで、Laravelでのアプリケーション開発がより効率的かつ柔軟になります。

User::find(1);でも、インスタンス生成後$user->find(1);という書き方でも両方呼び出せる理由

aravelのEloquent ORMでは、

User::find(1);

のような静的メソッドの呼び出しと、インスタンスを生成した後に

$user->find(1); 

のようにインスタンスメソッドとして呼び出すことができるのは、Eloquentの内部動作によるものです。これを理解するには、Eloquentのモデルがどのように構築されているかを見てみる必要があります。

静的メソッドの呼び出し (User::find(1);)

  • 静的メソッドの呼び出しでは、Eloquentモデルクラス(この場合はUser)は実際にはインスタンス化されていません。
  • find は静的メソッドとして定義されているわけではありませんが、Laravelではマジックメソッド __callStatic を使用して、実際にはインスタンスメソッドであるメソッドを静的メソッドとして呼び出せるようにしています。
  • User::find(1); という呼び出しは、内部的には User モデルの新しいインスタンスを作成し、そのインスタンスに対して find メソッドを呼び出すことになります。

インスタンスメソッドの呼び出し ($user->find(1);)

  • ここでは、まず User のインスタンスが作成され ($user = new User();)、その後でインスタンスメソッド find が呼び出されます。
  • この場合、find は通常のインスタンスメソッドとして動作し、指定されたIDに基づいてデータベースからレコードを検索します。
  • LaravelのEloquentでは、マジックメソッド __call を使用して、インスタンスメソッドとして呼び出された場合にも、実際の処理をモデルのクエリビルダに委譲します。

結論

  • User::find(1);$user->find(1); の両方が動作するのは、LaravelのEloquent ORMがマジックメソッド __call__callStatic を使って、静的メソッドの呼び出しをインスタンスメソッドの呼び出しに変換しているからです。
  • これにより、Eloquentモデルは非常に柔軟なAPIを提供し、開発者がより直感的にモデルを扱えるようになっています。ただし、通常はモデルの静的メソッド(User::find(1);)を使用することが一般的です。

コメント

タイトルとURLをコピーしました