- はじめに
- 利用可能なメソッド
- append($attributes)
- contains($key, $operator = null, $value = null)
- diff($items)
- except($keys)
- find($key)
- findOrFail($key)
- fresh($with = [])
- intersect($items)
- load($relations)
- loadMissing($relations)
- modelKeys()
- makeVisible($attributes)
- makeHidden($attributes)
- only($keys)
- setVisible($attributes)
- setHidden($attributes)
- toQuery()
- unique($key = null, $strict = false)
- カスタムコレクション
はじめに
複数のモデル結果を返すすべてのEloquentメソッドは、Illuminate\Database\Eloquent\Collection
クラスのインスタンスを返します。これは、get
メソッドを介して取得された結果や、リレーションシップを介してアクセスされた結果を含みます。EloquentコレクションオブジェクトはLaravelの基本コレクションを拡張しているため、Eloquentモデルの基礎となる配列を流暢に操作するために使用される数十のメソッドを自然に継承します。これらの便利なメソッドについて学ぶために、Laravelコレクションのドキュメントを確認してください!
すべてのコレクションはイテレータとしても機能し、単純なPHP配列のようにループすることができます:
use App\Models\User;
$users = User::where('active', 1)->get();
foreach ($users as $user) {
echo $user->name;
}
しかし、前述のように、コレクションは配列よりもはるかに強力で、直感的なインターフェースを使用してチェーン可能なさまざまなマップ/リデュース操作を公開します。たとえば、すべての非アクティブモデルを削除し、残りの各ユーザーのファーストネームを収集することができます:
$names = User::all()->reject(function (User $user) {
return $user->active === false;
})->map(function (User $user) {
return $user->name;
});
Eloquentコレクションの変換
ほとんどのEloquentコレクションメソッドは新しいEloquentコレクションのインスタンスを返しますが、collapse
、flatten
、flip
、keys
、pluck
、および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)
``````php
$users->append('team');
$users->append(['team', 'is_admin']);
`
contains($key, $operator = null, $value = null)
``````php
$users->contains(1);
$users->contains(User::find(1));
`
diff($items)
``````php
use App\Models\User;
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());
`
except($keys)
``````php
$users = $users->except([1, 2, 3]);
`
find($key)
``````php
$users = User::all();
$user = $users->find(1);
`
findOrFail($key)
``````php
$users = User::all();
$user = $users->findOrFail(1);
`
fresh($with = [])
``````php
$users = $users->fresh();
$users = $users->fresh('comments');
`
intersect($items)
``````php
use App\Models\User;
$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());
`
load($relations)
``````php
$users->load(['comments', 'posts']);
$users->load('comments.author');
$users->load(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);
`
loadMissing($relations)
``````php
$users->loadMissing(['comments', 'posts']);
$users->loadMissing('comments.author');
$users->loadMissing(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);
`
modelKeys()
``````php
$users->modelKeys();
// [1, 2, 3, 4, 5]
`
makeVisible($attributes)
``````php
$users = $users->makeVisible(['address', 'phone_number']);
`
makeHidden($attributes)
``````php
$users = $users->makeHidden(['address', 'phone_number']);
`
only($keys)
``````php
$users = $users->only([1, 2, 3]);
`
setVisible($attributes)
``````php
$users = $users->setVisible(['id', 'name']);
`
setHidden($attributes)
``````php
$users = $users->setHidden(['email', 'password', 'remember_token']);
`
toQuery()
``````php
use App\Models\User;
$users = User::where('status', 'VIP')->get();
$users->toQuery()->update([
'status' => 'Administrator',
]);
`
unique($key = null, $strict = false)
``````php
$users = $users->unique();
`
カスタムコレクション
特定のモデルと対話する際にカスタムCollection
オブジェクトを使用したい場合は、モデルにnewCollection
メソッドを定義できます:
<?php
namespace App\Models;
use App\Support\UserCollection;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Create a new Eloquent Collection instance.
*
* @param array<int, \Illuminate\Database\Eloquent\Model> $models
* @return \Illuminate\Database\Eloquent\Collection<int, \Illuminate\Database\Eloquent\Model>
*/
public function newCollection(array $models = []): Collection
{
return new UserCollection($models);
}
}
newCollection
メソッドを定義すると、Eloquentが通常Illuminate\Database\Eloquent\Collection
インスタンスを返す場合に、カスタムコレクションのインスタンスを受け取ります。アプリケーション内のすべてのモデルにカスタムコレクションを使用したい場合は、アプリケーションのすべてのモデルによって拡張される基本モデルクラスにnewCollection
メソッドを定義する必要があります。