イントロダクションIntroduction
get
メソッドで取得した結果や、リレーションによりアクセスした結果など、結果として複数のモデルを返すEloquentメソッドはすべて、Illuminate\Database\Eloquent\Collection
クラスのインスタンスを返します。EloquentコレクションオブジェクトはLaravelの基本的なコレクションを拡張しているため、基になるEloquentモデルの配列をスムーズに操作できるように使用する、数十のメソッドを自然に継承します。これらの便利なメソッドをすべて学ぶために、Laravelコレクションのドキュメントは必ず確認してください!All Eloquent methods that return
more than one model result will return instances of
the
Illuminate\Database\Eloquent\Collection
class, including results retrieved via the
get
method or accessed via a
relationship. The Eloquent collection object extends
Laravel's base
collection[/docs/{{version}}/collections],
so it naturally inherits dozens of methods used to
fluently work with the underlying array of Eloquent
models. Be sure to review the Laravel collection
documentation to learn all about these helpful
methods!
すべてのコレクションはイテレーターとしても機能し、単純なPHP配列のようにループで使えます。All collections also serve as iterators, allowing you to loop over them as if they were simple PHP arrays:
use App\Models\User;
$users = User::where('active', 1)->get();
foreach ($users as $user) {
echo $user->name;
}
ただし、前述のようにコレクションは配列よりもはるかに強力であり、直感的なインターフェイスを使用してチェーンする可能性を持つさまざまなマップ/リデュース操作を用意しています。たとえば、非アクティブなモデルをすべて削除してから、残りのユーザーの名を収集する場面を考えましょう。However, as previously mentioned, collections are much more powerful than arrays and expose a variety of map / reduce operations that may be chained using an intuitive interface. For example, we may remove all inactive models and then gather the first name for each remaining user:
$names = User::all()->reject(function (User $user) {
return $user->active === false;
})->map(function (User $user) {
return $user->name;
});
Eloquentコレクションの変換Eloquent Collection Conversion
ほとんどのEloquentコレクションメソッドはEloquentコレクションの新しいインスタンスを返しますが、collapse
、flatten
、flip
、keys
、pluck
、zip
メソッドは、基本のコレクションインスタンスを返します。同様に、map
操作がEloquentモデルを含まないコレクションを返す場合、それは基本コレクションインスタンスに変換されます。While most Eloquent collection
methods return a new instance of an Eloquent
collection, the collapse
,
flatten
, flip
,
keys
, pluck
, and
zip
methods return a base
collection[/docs/{{version}}/collections]
instance. Likewise, if a map
operation
returns a collection that does not contain any
Eloquent models, it will be converted to a base
collection instance.
利用可能なメソッドAvailable Methods
すべてのEloquentコレクションはベースのLaravelコレクションオブジェクトを拡張します。したがって、これらは基本コレクションクラスによって提供されるすべての強力なメソッドを継承します。All Eloquent collections extend the base Laravel collection[/docs/{{version}}/collections#available-methods] object; therefore, they inherit all of the powerful methods provided by the base collection class.
さらに、Illuminate\Database\Eloquent\Collection
クラスは、モデルコレクションの管理を支援するメソッドのスーパーセットを提供します。ほとんどのメソッドはIlluminate\Database\Eloquent\Collection
インスタンスを返します。ただし、modelKeys
などの一部のメソッドは、Illuminate\Support\Collection
インスタンスを返します。In addition, the
Illuminate\Database\Eloquent\Collection
class provides a superset of methods to aid with
managing your model collections. Most methods return
Illuminate\Database\Eloquent\Collection
instances; however, some methods, like
modelKeys
, return an
Illuminate\Support\Collection
instance.
append contains diff except find fresh intersect load loadMissing modelKeys makeVisible makeHidden only setVisible setHidden toQuery unique
append($attributes)
append($attributes)
append
メソッドは、コレクション内の全モデルへ属性を追加するように指示するために使用します。このメソッドには、属性の配列か、単一の属性を指定します。The append
method
may be used to indicate that an attribute should be
appended[/docs/{{version}}/eloquent-serialization#appending-values-to-json]
for every model in the collection. This method
accepts an array of attributes or a single
attribute:
$users->append('team');
$users->append(['team', 'is_admin']);
contains($key, $operator = null, $value =
null)
contains($key, $operator =
null, $value = null)
contains
メソッドを使い、指定モデルインスタンスがコレクションに含まれているかどうかを判定できます。このメソッドは、主キーまたはモデルインスタンスを引数に取ります。The contains
method
may be used to determine if a given model instance
is contained by the collection. This method accepts
a primary key or a model instance:
$users->contains(1);
$users->contains(User::find(1));
diff($items)
diff($items)
diff
メソッドは、指定コレクションに存在しないすべてのモデルを返します。The diff
method
returns all of the models that are not present in
the given collection:
use App\Models\User;
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());
except($keys)
except($keys)
except
メソッドは、指定する主キーを持たないすべてのモデルを返します。The except
method
returns all of the models that do not have the given
primary keys:
$users = $users->except([1, 2, 3]);
find($key)
find($key)
find
メソッドは、指定キーと一致する主キーを持つモデルを返します。$key
がモデルインスタンスの場合、find
は主キーに一致するモデルを返そうとします。$key
がキーの配列である場合、find
は指定配列の中の主キーを持つすべてのモデルを返します。The find
method
returns the model that has a primary key matching
the given key. If $key
is a model
instance, find
will attempt to return a
model matching the primary key. If $key
is an array of keys, find
will return
all models which have a primary key in the given
array:
$users = User::all();
$user = $users->find(1);
fresh($with = [])
fresh($with = [])
fresh
メソッドは、データベースからコレクション内の各モデルの新しいインスタンスを取得します。さらに、指定したリレーションはすべてEagerロードされます。The fresh
method
retrieves a fresh instance of each model in the
collection from the database. In addition, any
specified relationships will be eager
loaded:
$users = $users->fresh();
$users = $users->fresh('comments');
intersect($items)
intersect($items)
intersect
メソッドは、指定コレクションにも存在するすべてのモデルを返します。The intersect
method
returns all of the models that are also present in
the given collection:
use App\Models\User;
$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());
load($relations)
load($relations)
load
メソッドは、コレクション内のすべてのモデルに対して指定するリレーションをEagerロードします。The load
method
eager loads the given relationships for all models
in the collection:
$users->load(['comments', 'posts']);
$users->load('comments.author');
$users->load(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);
loadMissing($relations)
loadMissing($relations)
loadMissing
メソッドは、関係がまだロードされていない場合、コレクション内のすべてのモデルに対して指定するリレーションをEagerロードします。The loadMissing
method eager loads the given relationships for all
models in the collection if the relationships are
not already loaded:
$users->loadMissing(['comments', 'posts']);
$users->loadMissing('comments.author');
$users->loadMissing(['comments', 'posts' => fn ($query) => $query->where('active', 1)]);
modelKeys()
modelKeys()
modelKeys
メソッドは、コレクション内のすべてのモデルの主キーを返します。The modelKeys
method
returns the primary keys for all models in the
collection:
$users->modelKeys();
// [1, 2, 3, 4, 5]
makeVisible($attributes)
makeVisible($attributes)
makeVisible
メソッドは、通常コレクション内の各モデルで"hidden"になっている属性をvisibleにします。The makeVisible
method makes attributes
visible[/docs/{{version}}/eloquent-serialization#hiding-attributes-from-json]
that are typically "hidden" on each model
in the collection:
$users = $users->makeVisible(['address', 'phone_number']);
makeHidden($attributes)
makeHidden($attributes)
makeHidden
メソッドは、通常コレクション内の各モデルで"visible"になっている属性をhiddenにします。The makeHidden
method hides
attributes[/docs/{{version}}/eloquent-serialization#hiding-attributes-from-json]
that are typically "visible" on each model
in the collection:
$users = $users->makeHidden(['address', 'phone_number']);
only($keys)
only($keys)
only
メソッドは、指定主キーを持つすべてのモデルを返します。The only
method
returns all of the models that have the given
primary keys:
$users = $users->only([1, 2, 3]);
setVisible($attributes)
setVisible($attributes)
setVisible
メソッドは、コレクション内の各モデルの全てのvisible属性を一時的に上書きします。The setVisible
method temporarily
overrides[/docs/{{version}}/eloquent-serialization#temporarily-modifying-attribute-visibility]
all of the visible attributes on each model in the
collection:
$users = $users->setVisible(['id', 'name']);
setHidden($attributes)
setHidden($attributes)
setHidden
メソッドは、コレクション内の各モデルの全てのhidden属性を一時的に上書きします。The setHidden
method
temporarily
overrides[/docs/{{version}}/eloquent-serialization#temporarily-modifying-attribute-visibility]
all of the hidden attributes on each model in the
collection:
$users = $users->setHidden(['email', 'password', 'remember_token']);
toQuery()
toQuery()
toQuery
メソッドは、コレクションモデルの主キーに対するwhereIn
制約を含むEloquentクエリビルダインスタンスを返します。The toQuery
method
returns an Eloquent query builder instance
containing a whereIn
constraint on the
collection model's primary keys:
use App\Models\User;
$users = User::where('status', 'VIP')->get();
$users->toQuery()->update([
'status' => 'Administrator',
]);
unique($key = null, $strict = false)
unique($key = null, $strict
= false)
unique
メソッドは、コレクション内のすべての一意のモデルを返します。コレクション内の、同じタイプで同じ主キーを持つモデルをすべて削除します。The unique
method
returns all of the unique models in the collection.
Any models of the same type with the same primary
key as another model in the collection are
removed:
$users = $users->unique();
カスタムコレクションCustom Collections
特定のモデルを操作するときにカスタムのCollection
オブジェクトを使用したい場合は、モデルでnewCollection
メソッドを定義します。If you would like to use a custom
Collection
object when interacting with
a given model, you may define a
newCollection
method on your
model:
<?php
namespace App\Models;
use App\Support\UserCollection;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 新しいEloquentCollectionインスタンスの作成
*
* @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
メソッドを定義する必要があります。Once you have defined a
newCollection
method, you will receive
an instance of your custom collection anytime
Eloquent would normally return an
Illuminate\Database\Eloquent\Collection
instance. If you would like to use a custom
collection for every model in your application, you
should define the newCollection
method
on a base model class that is extended by all of
your application's models.