概要
Collectionには、"Higher Orderメッセージ"なる機能が存在します。
"Higher Orderメッセージ"に対応しているCollectionメソッドを動的プロパティのように記述して処理を短くかけるというものです。
何のこっちゃと思うので例を書いてみます
例1
$users = User::all();
//before
$users->each(function (User $user){
$user->archive();
});
//after
$users->each->archive();
beforeを"Higher Orderメッセージ"で書き直したのがafterになります。
「$users
の単一の要素をeach
で繰り返します。その際にarchive
をします。」
みたいな書き方。
例2
mapの場合だと
$users = User::all();
//before
$users->map(function (User $user){
$user->profile;
});
//after
$users->map->profile;
みたいな感じ。勿論チェーンで通常のコレクションメソッドを繋げて書けます。
ユーザー達の画像コレクションの内、最初のレコードを取得する例を挙げてみましょう。
$users = User::all();
//before
$users->flatMap(function (User $user){
$user->images;
})->first();
//after
$users->flatMap->images->first();
こんな感じに通常のコレクションを後ろから生やす事が出来ます。
flatMap->images
の段階で出来上がるのはimageオブジェクトのフラットなコレクションですからね。
一応
$users->flatMap->images->map->user;
みたいにチェーンで繋げて動かす事も可能なようですが、first
は上手く動作しませんでした。
対応しているメソッド
average、avg、contains、each、every、filter、first、flatMap、groupBy、keyBy、map、max、min、partition、reject、skipUntil、skipWhile、some、sortBy、sortByDesc、sum、unique、takeUntil、takeWhile
参考