イントロダクション

getメソッドであれリレーションによるものであれ、Eloquentが複数のレコードをリターンする場合Illuminate\Database\Eloquent\Collectionオブジェクトが返されます。EloquentコレクションオブジェクトはLaravelのベースコレクションを継承しているので、Eloquentモデルの裏にある配列をスムーズに操作するために継承した多くのメソッドがもちろん使用できます。

当然ながら全コレクションはイリテーターとしても動作し、シンプルなPHP配列のようにループで取り扱うことができます。

$users = App\User::where('active', 1)->get();

foreach ($users as $user) {
    echo $user->name;
}

しかしコレクションは配列よりもパワフルで直感的なインターフェイスを使ったメソッドチェーンにより、マッピングや要素の省略操作を行うことができます。例としてアクティブでないモデルを削除し、残ったユーザのファーストネームを集めてみましょう。

$users = App\User::where('active', 1)->get();

$names = $users->reject(function ($user) {
    return $user->active === false;
})
->map(function ($user) {
    return $user->name;
});

Note: ほとんどのEloquentコレクションは新しいEloquentコレクションのインスタンスを返しますが、pluckkeyszipcollapseflattenflipメソッドはベースのコレクションインスタンスを返します。Eloquentモデルをまったく含まないコレクションを返すmap操作のような場合、自動的にベースコレクションへキャストされます。

使用できるメソッド

ベースのコレクション

全EloquentコレクションはベースのLaravelコレクションオブジェクトを拡張しており、そのためにベースコレクションクラスが提供しているパワフルなメソッドを全部継承しています。

all except implode pluck shift transform
avg filter intersect pop shuffle union
chunk first isEmpty prepend slice unique
collapse flatMap keyBy pull sort values
combine flatten keys push sortBy where
contains flip last put sortByDesc whereStrict
count forget map random splice whereIn
diff forPage max reduce sum whereInLoose
diffKeys get merge reject take zip
each groupBy min reverse toArray  
every has only search toJson  

カスタムコレクション

自分で拡張したメソッドを含むカスタム「コレクション」オブジェクトを使いたい場合は、モデルのnewCollectionメソッドをオーバーライドしてください。

<?php

namespace App;

use App\CustomCollection;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 新しいEloqunetコレクションインスタンスの生成
     *
     * @param  array  $models
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function newCollection(array $models = [])
    {
        return new CustomCollection($models);
    }
}

newCollectionメソッドを定義すれば、Eloquentがそのモデルの「コレクション」インスタンスを返す場合にいつでもカスタムコレクションのインスタンスを受け取れます。アプリケーションの全モデルでカスタムコレクションを使いたい場合は、全モデルが拡張しているモデルのベースクラスでnewCollectionメソッドをオーバーライドしてください。