はじめに

複数のモデル結果を返すすべてのEloquentメソッドは、Illuminate\Database\Eloquent\Collectionクラスのインスタンスを返します。これは、getメソッドを介して取得された結果や、リレーションシップを介してアクセスされた結果を含みます。EloquentコレクションオブジェクトはLaravelの基本コレクションを拡張しているため、Eloquentモデルの基礎となる配列を流暢に操作するために使用される数十のメソッドを自然に継承します。これらの便利なメソッドについて学ぶために、Laravelコレクションのドキュメントを確認してください!

すべてのコレクションはイテレータとしても機能し、単純なPHP配列のようにループすることができます:

  1. use App\Models\User;
  2. $users = User::where('active', 1)->get();
  3. foreach ($users as $user) {
  4. echo $user->name;
  5. }

しかし、前述のように、コレクションは配列よりもはるかに強力で、直感的なインターフェースを使用してチェーン可能なさまざまなマップ/リデュース操作を公開します。たとえば、すべての非アクティブモデルを削除し、残りの各ユーザーのファーストネームを収集することができます:

  1. $names = User::all()->reject(function (User $user) {
  2. return $user->active === false;
  3. })->map(function (User $user) {
  4. return $user->name;
  5. });

Eloquentコレクションの変換

ほとんどのEloquentコレクションメソッドは新しいEloquentコレクションのインスタンスを返しますが、collapseflattenflipkeyspluck、およびzipメソッドは基本コレクションのインスタンスを返します。同様に、map操作がEloquentモデルを含まないコレクションを返す場合、それは基本コレクションインスタンスに変換されます。

利用可能なメソッド

すべてのEloquentコレクションは基本のLaravelコレクションオブジェクトを拡張しているため、基本コレクションクラスによって提供されるすべての強力なメソッドを継承します。

さらに、Illuminate\Database\Eloquent\Collectionクラスはモデルコレクションの管理を支援するためのメソッドのスーパーセットを提供します。ほとんどのメソッドはIlluminate\Database\Eloquent\Collectionインスタンスを返しますが、modelKeysのような一部のメソッドはIlluminate\Support\Collectionインスタンスを返します。

append contains diff except find findOrFail fresh intersect load loadMissing modelKeys makeVisible makeHidden only setVisible setHidden toQuery unique

append($attributes)

  1. ``````php
  2. $users->append('team');
  3. $users->append(['team', 'is_admin']);
  4. `

contains($key, $operator = null, $value = null)

  1. ``````php
  2. $users->contains(1);
  3. $users->contains(User::find(1));
  4. `

diff($items)

  1. ``````php
  2. use App\Models\User;
  3. $users = $users->diff(User::whereIn('id', [1, 2, 3])->get());
  4. `

except($keys)

  1. ``````php
  2. $users = $users->except([1, 2, 3]);
  3. `

find($key)

  1. ``````php
  2. $users = User::all();
  3. $user = $users->find(1);
  4. `

findOrFail($key)

  1. ``````php
  2. $users = User::all();
  3. $user = $users->findOrFail(1);
  4. `

fresh($with = [])

  1. ``````php
  2. $users = $users->fresh();
  3. $users = $users->fresh('comments');
  4. `

intersect($items)

  1. ``````php
  2. use App\Models\User;
  3. $users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());
  4. `

load($relations)

  1. ``````php
  2. $users->load(['comments', 'posts']);
  3. $users->load('comments.author');
  4. $users->load(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);
  5. `

loadMissing($relations)

  1. ``````php
  2. $users->loadMissing(['comments', 'posts']);
  3. $users->loadMissing('comments.author');
  4. $users->loadMissing(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);
  5. `

modelKeys()

  1. ``````php
  2. $users->modelKeys();
  3. // [1, 2, 3, 4, 5]
  4. `

makeVisible($attributes)

  1. ``````php
  2. $users = $users->makeVisible(['address', 'phone_number']);
  3. `

makeHidden($attributes)

  1. ``````php
  2. $users = $users->makeHidden(['address', 'phone_number']);
  3. `

only($keys)

  1. ``````php
  2. $users = $users->only([1, 2, 3]);
  3. `

setVisible($attributes)

  1. ``````php
  2. $users = $users->setVisible(['id', 'name']);
  3. `

setHidden($attributes)

  1. ``````php
  2. $users = $users->setHidden(['email', 'password', 'remember_token']);
  3. `

toQuery()

  1. ``````php
  2. use App\Models\User;
  3. $users = User::where('status', 'VIP')->get();
  4. $users->toQuery()->update([
  5. 'status' => 'Administrator',
  6. ]);
  7. `

unique($key = null, $strict = false)

  1. ``````php
  2. $users = $users->unique();
  3. `

カスタムコレクション

特定のモデルと対話する際にカスタムCollectionオブジェクトを使用したい場合は、モデルにnewCollectionメソッドを定義できます:

  1. <?php
  2. namespace App\Models;
  3. use App\Support\UserCollection;
  4. use Illuminate\Database\Eloquent\Collection;
  5. use Illuminate\Database\Eloquent\Model;
  6. class User extends Model
  7. {
  8. /**
  9. * Create a new Eloquent Collection instance.
  10. *
  11. * @param array<int, \Illuminate\Database\Eloquent\Model> $models
  12. * @return \Illuminate\Database\Eloquent\Collection<int, \Illuminate\Database\Eloquent\Model>
  13. */
  14. public function newCollection(array $models = []): Collection
  15. {
  16. return new UserCollection($models);
  17. }
  18. }

newCollectionメソッドを定義すると、Eloquentが通常Illuminate\Database\Eloquent\Collectionインスタンスを返す場合に、カスタムコレクションのインスタンスを受け取ります。アプリケーション内のすべてのモデルにカスタムコレクションを使用したい場合は、アプリケーションのすべてのモデルによって拡張される基本モデルクラスにnewCollectionメソッドを定義する必要があります。