- カテゴリ: collection
- 対応バージョン: Laravel 11・12・PHP 8.2
- 名前空間 / FQCN / コマンド:
Illuminate\Support\Collection::all - 関連:
toArray/values/collect/Eloquent\Collection/LazyCollection - 変更履歴: なし
※指定がなかったため、対応バージョンは既定(Laravel 11・12 / PHP 8.2)で記述。
要点(TL;DR)
- 何に使うか:コレクション内部の要素をそのままの配列(再帰変換なし・キー保持)で取り出す。
- 最低限の使い方:
$array = collect($items)->all(); - よくある罠:
all()は配列を返すためチェーン不可(->map()等は続けられない)toArray()は再帰的に配列化、all()は中身(モデル等)をそのまま返すLazyCollectionでall()は全件を評価してメモリ消費が増える
概要
all()はCollection/Eloquent\Collectionの中身をそのままPHP配列として取り出すメソッドです。キーは保持され、要素がモデルやオブジェクトならオブジェクトのまま返ります。配列が必要な外部API・標準関数に渡す際に有用ですが、チェーン処理は途切れるため、後続のコレクション操作が必要ならvalues()やそのままCollectionで扱うのが安全です。
構文 / シグネチャ
/** Get the underlying items as a plain array. */
public function all(): array;
引数(なし)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| なし | — | — | — | — |
- 戻り値:
array(キー保持。要素はそのまま) - 例外/副作用:
LazyCollectionでは全要素を評価して配列化(メモリ使用増)。Collectionでは基本O(1)で内部配列を返す。
カテゴリ追記(collection規約)
- チェーン可否:不可(配列を返す)
- 破壊的/非破壊:非破壊(元コレクションは変更しない)
- キー保持:保持する
- LazyCollection対応:可。ただし全件読み込み
- 計算量の目安:
CollectionはO(1)参照、LazyCollectionはO(n)評価
使用例
最小例
use Illuminate\Support\Collection;
$col = collect(['a' => 1, 'b' => 2]);
$array = $col->all(); // ['a' => 1, 'b' => 2]
実務例:Eloquentモデルの配列化の違い
use App\Models\User;
// モデルのコレクション
$users = User::query()->limit(2)->get();
// all(): モデルオブジェクト配列
$asObjects = $users->all(); // [User, User]
// toArray(): 再帰配列(属性配列へ展開)
$asArrays = $users->toArray(); // [['id'=>..., 'name'=>...], [...]]
// APIに配列を渡す(モデルのまま必要ならall、純配列ならtoArray)
someLibrary($users->all()); // モデル配列を渡す
someApiCall($users->toArray()); // 連想配列を渡す
キーをリセットして配列が欲しい場合
$col = collect(['x' => 10, 'y' => 20]);
$numeric = $col->values()->all(); // [10, 20](キーを0..に振り直し)
LazyCollection注意例(全件読み込み)
use App\Models\Log;
// 大量件数をカーソルでストリーム処理したいのに…
$logs = Log::cursor(); // LazyCollection
$all = $logs->all(); // ここで全件メモリに載る。避けたい場合は逐次処理にする
よくある落とし穴・注意
- チェーンが切れる:
->all()の後に->map()等は使えません(配列にはメソッドがない)。必要ならall()を外すか、collect($array)で再ラップ。 toArray()との混同:toArray()は再帰的に配列化し、Eloquentモデルは属性配列へ展開。all()は素の要素(モデルはモデルのまま)を返す。- キー問題:キーを連番にしたいなら
values()->all()を使う。 - LazyCollectionの全件評価:
cursor()等の結果でall()はストリーミングの利点を潰す。大量データでは避ける。 Model::all()と別物:User::all()(全件取得の静的メソッド)とCollection::all()(配列化)は用途が全く違う。
代替・関連APIとの比較
toArray():再帰配列化(モデル→属性配列)。外部APIにJSON/配列で渡すならこちらが安全。values():キーを0始まりで振り直したコレクションを返す(チェーン継続可)。collect():配列→コレクションへ再ラップ。all()で配列化した後に再度チェーンしたいときに使用。Eloquent\Collection:all()は同様に配列化するが、中身はModelオブジェクト。
テスト例(Pest)
use App\Models\User;
it('returns underlying array with keys kept', function () {
$col = collect(['a' => 1, 'b' => 2]);
$arr = $col->all();
expect($arr)->toBeArray()
->and(array_keys($arr))->toEqual(['a','b']);
});
it('differs from toArray on Eloquent models', function () {
$users = User::factory()->count(1)->create();
$all = $users->all(); // [User]
$arr = $users->toArray(); // [['id'=>..., ...]]
expect($all[0])->toBeInstanceOf(User::class)
->and($arr[0])->toBeArray();
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
Call to a member function map() on array | all()で配列化した後にコレクションメソッドを呼んでいる | all()を外す/collect($array)->map(...)で再ラップ |
| メモリ不足(Allowed memory size…) | LazyCollectionにall()して全件読み込み | ストリーム処理に徹しeach()/chunk()等を使用 |
| 期待と違うJSON出力 | all()でモデル配列→シリアライズ挙動が想定外 | toArray()もしくはAPIリソース(Resource)を使用 |
参考リンク
- Laravel公式:Collections「
allメソッド」
https://laravel.com/docs/11.x/collections#method-all - Laravel公式:Eloquent Collections
https://laravel.com/docs/11.x/eloquent-collections - Laravel公式:Lazy Collections
https://laravel.com/docs/11.x/collections#lazy-collections - ソースコード(
Illuminate\Support\Collection)
https://github.com/laravel/framework/blob/11.x/src/Illuminate/Support/Collection.php - 関連:
valuesメソッド
https://laravel.com/docs/11.x/collections#method-values
関連(サイト内):toArray / values / collect / chunk / cursor

