Skip to main content

高階メッセージとは

高階メッセージ(Higher-order Messages)は、コレクションのメソッドをプロパティアクセスの形で呼び出す構文です。コールバックを書くことなく、各要素に対してメソッドを呼び出したり、プロパティを取得したりできます。
$users->map->name は「各ユーザーの name プロパティを取り出して map する」という意味になります。

仕組み — HigherOrderCollectionProxy

$collection->map のようにプロパティとしてアクセスすると、EnumeratesValues トレイトの __get() が呼ばれます。
$proxies に含まれるメソッド名の場合、HigherOrderCollectionProxy インスタンスが返ります。このプロキシはコレクションとメソッド名の2つを保持します。

__get によるプロパティアクセスのプロキシ

続けてプロパティにアクセス(->name)すると、プロキシの __get() が呼ばれます。
つまり $users->map->name は次と同等です。

__call によるメソッド呼び出しのプロキシ

続けてメソッドを呼び出す(->activate())と、プロキシの __call() が呼ばれます。
$users->each->activate() は次と同等です。

対応しているメソッド一覧

高階メッセージとして使えるメソッドは $proxies 配列で定義されています。
カスタムメソッドを追加するには Collection::proxy() を使います。

実践的なユースケース

Eloquentモデルのコレクション

高階メッセージはEloquentのコレクションで特に便利です。

フィルタリング

集計

グループ化・ソート

flatMap でネストを展開

条件確認

文字列コレクション

値が文字列のコレクションでも使えます。プロキシの __call() は文字列の場合に静的メソッドとして呼び出します。
文字列コレクションへの高階メッセージは、メソッドが文字列型に静的に定義されている必要があります。通常はEloquentモデルや独自クラスのコレクションで使うのが自然です。

通常のクロージャとの比較

高階メッセージは簡潔ですが、すべてのケースで使えるわけではありません。
「各要素の同じプロパティを取り出す」「各要素の同じメソッドを呼ぶ」場合は高階メッセージが読みやすくなります。条件が複雑だったり引数が動的だったりする場合はクロージャを使います。

カスタムクラスで高階メッセージを使う

EnumeratesValues トレイトを通じて HigherOrderCollectionProxy の仕組みを利用するには、Collection::proxy() を呼んでメソッドをプロキシ対象に追加します。

次のステップ

Conditionableトレイト

when() / unless() の内部実装と、QueryBuilderや自作クラスへの適用方法を学びます。
最終更新日 2026年3月28日