- カテゴリ: collection
 - 掲載バージョン: Laravel 12・PHP 8.4
 - 名前空間 / FQCN / コマンド: 
Illuminate\Support\Collection::has - 関連: 
hasAny/contains/keys/Illuminate\Support\Arr::has/data_get - 変更履歴: 既存機能(Laravel初期から概ね同等)
 
要点(TL;DR)
- 何に使うか:コレクションに**特定のキー(index)**が存在するかを真偽で判定。
 - 最低限の使い方:
collect(['a' => 1])->has('a'); // true - よくある罠
- 値の有無ではなくキーの有無を判定(
nullでも存在すればtrue) - ドット記法は不可(ネストは
Arr::hasを使う) - 複数キー配列を渡すとすべて存在でtrue(一部で良いなら
hasAny) 
 - 値の有無ではなくキーの有無を判定(
 
概要
Collection::has はコレクションに指定したキーが存在するかを判定します。単一キーまたはキー配列を受け取り、配列の場合は 全キーが存在する時に true を返します。
フォーム入力の必須項目の存在確認、設定配列の項目チェックなど、キーの網羅確認に向いています。
構文 / シグネチャ
bool Illuminate\Support\Collection::has(string|int|array $key)
- 引数(表) 引数 型 必須 既定値 説明 $key string|int|array はい なし 調べるキー。配列を渡すと「全てのキーが存在」で 
true - 戻り値:
bool(条件を満たせばtrue) - 例外/副作用:特になし(非破壊)
 
使用例
最小例
<?php
use Illuminate\Support\Collection;
$col = collect(['name' => 'Taylor', 'age' => null]);
var_dump($col->has('name'));      // true
var_dump($col->has('age'));       // true(値が null でもキーがあれば true)
var_dump($col->has('email'));     // false
var_dump($col->has(['name','age']));   // true(全て存在)
var_dump($col->has(['name','email'])); // false(email が無い)
実務例
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
function buildUserDto(Request $request): array
{
    // 入力の必須キーがすべて存在するか(値のnullは許容)
    $payload = collect($request->all());
    if (! $payload->has(['name', 'email', 'profile'])) {
        // ネストが必要なら Arr::has でチェック(ドット記法)
        if (! Arr::has($request->all(), ['profile.bio'])) {
            abort(422, 'missing required keys');
        }
    }
    return [
        'name' => $payload->get('name'),
        'email' => $payload->get('email'),
        'bio' => data_get($payload, 'profile.bio'), // 値の取得は data_get が便利
    ];
}
よくある落とし穴・注意
- 値の有無ではない:
isset($arr['age'])と違い、nullでもキーがあればtrue。 - ネストには非対応:
user.nameのようなドット記法不可。ネストはArr::has($array, 'user.name')を使用。 - 複数キーはAND判定:配列を渡すと「すべて揃っているか」。一部で良いなら 
hasAny。 - 計算量:キーの直接参照のためO(m)(m=確認するキー数)。データサイズnに依存しにくい。
 - LazyCollection:概念的にキー存在判定は終端操作に近いが、
LazyCollectionでも利用可(大量ストリームよりは通常コレクション向き)。 
代替・関連APIとの比較
has:キーの存在(AND)。値は不問、nullでも可。hasAny:複数キーのOR 判定。contains:値(または条件)を含むか。キーではない。Arr::has:配列に対してドット記法でネストキーを判定。Eloquent属性配列などに有効。isset/array_key_exists:生PHP。issetはnullでfalse、array_key_existsはnullでもtrue。hasは後者に近い。
テスト例(Pest)
<?php
use Illuminate\Support\Collection;
it('checks key existence including null values', function () {
    $c = collect(['a' => 1, 'b' => null]);
    expect($c->has('a'))->toBeTrue()
        ->and($c->has('b'))->toBeTrue()   // nullでもキーがあればtrue
        ->and($c->has('c'))->toBeFalse()
        ->and($c->has(['a','b']))->toBeTrue()
        ->and($c->has(['a','c']))->toBeFalse();
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 | 
|---|---|---|
ネストキー user.name が常に false | has はドット記法非対応 | Arr::has($array, 'user.name') を使う | 
null の項目があるのに true になる | has は値ではなくキー存在で判定 | 値の有無を判定したい場合は filled 相当のロジックや contains を検討 | 
一部キーがあっても false | 複数キー配列はAND判定 | 一部一致で良いなら hasAny を使う | 
参考リンク
- Laravel Docs — Collections(
has)
https://laravel.com/docs/12.x/collections - Laravel API — 
Illuminate\Support\Collection
https://laravel.com/api/12.x/Illuminate/Support/Collection.html - Laravel Docs — 
Illuminate\Support\Arr::has
https://laravel.com/docs/12.x/helpers#method-arr-has - PHP — 
array_key_exists
https://www.php.net/array_key_exists 
コレクション特性メモ(カテゴリ要件)
- チェーン可否:戻り値が 
boolのためチェーン不可 - 破壊的/非破壊:非破壊
 - キー保持:入力のキー前提で判定
 - LazyCollection:利用可
 - 計算量:O(m)(m=確認キー数)
 - 入出力対応:入力=任意キー付きコレクション、出力=
bool 

  
  
  
  