LoginSignup
4
1

Laravel初心者向け、よく使うCollectionのフィルタリング系メソッド

Last updated at Posted at 2023-12-09

概要

自分が普段仕事で良く使うCollectionのメソッドを抜粋して紹介します。
EloquentCollection特有のメソッドは除外しています

そもそもCollectionとは

GPT「
Laravelにおける「Collection」は、データを効果的かつ柔軟に処理するための便利なクラスです。これはPHPの標準的な配列を拡張し、多くの操作やメソッドを提供するものです。

データの集まりを色々操作しやすくしている配列の拡張版みたいなものという解釈でOKです。
配列をCollectionに変換して利用するのが一般的です。

一覧

all

allメソッドはコレクションを配列に変換します

$collection = collect([
    ['name' => 'John', 'age' => 30],
    ['name' => 'Jane', 'age' => 25],
    ['name' => 'Doe', 'age' => 35],
]);

dd($collection->all());

// 結果:
//array:3 [▼ 
// 0 => array:2 [▼
//    "name" => "John"
//    "age" => 30
//  ]
//  1 => array:2 [▼
//    "name" => "Jane"
//    "age" => 25
//  ]
//  2 => array:2 [▼
//    "name" => "Doe"
//    "age" => 35
//  ]
//]

where

whereメソッドは、コレクション内の要素を特定の条件でフィルタリングします。

$collection = collect([
    ['name' => 'John', 'age' => 30],
    ['name' => 'Jane', 'age' => 25],
    ['name' => 'Doe', 'age' => 35],
]);

$filtered = $collection->where('age', '>=', 30);
dd($filtered->all());

// 結果:
//array:2 [▼ 
//  0 => array:2 [▼
//    "name" => "John"
//    "age" => 30
//  ]
//  2 => array:2 [▼
//    "name" => "Doe"
//    "age" => 35
//  ]
//]

厳密な比較を行いたい時はwhereStrict()を使いましょう

whereIn

whereInメソッドは、第一引数のキーに対して、第二引数の配列に含まれてる値を持つ要素をフィルタリングします。

$collection = collect([
    ['name' => 'John', 'age' => 30],
    ['name' => 'Jane', 'age' => 25],
    ['name' => 'Doe', 'age' => 35],
]);

$filtered = $collection->whereIn('age', [30,35]);
dd($filtered->all());

// 結果:
//array:2 [▼ 
//  0 => array:2 [▼
//    "name" => "John"
//    "age" => 30
//  ]
//  2 => array:2 [▼
//    "name" => "Doe"
//    "age" => 35
//  ]
//]

first

firstメソッドは、コレクションの最初の要素を取得します。

$collection = collect([
    ['name' => 'John', 'age' => 30],
    ['name' => 'Jane', 'age' => 25],
    ['name' => 'Doe', 'age' => 35],
]);

$filtered = $collection->first();
dd($filtered);

// 結果:
//array:2 [▼ 
//  "name" => "John"
//  "age" => 30
//]

firstWhere

firstWhereメソッドは文字通りfirstメソッドとwhereメソッドをセットにしたメソッドです。
条件に一致した最初の要素を取得します。

$collection = collect([
    ['name' => 'John', 'age' => 30],
    ['name' => 'Jane', 'age' => 25],
    ['name' => 'Doe', 'age' => 35],
]);

$filtered = $collection->firstWhere('age', '>=', 30);
dd($filtered);

// 結果:
//array:2 [▼ 
//  "name" => "John"
//  "age" => 30
//]

filter

filterメソッドは、引数に受け取ったコールバック関数内で条件に一致した要素を取得します。

$collection = collect([
    ['name' => 'John', 'age' => 30],
    ['name' => 'Jane', 'age' => 25],
    ['name' => 'Doe', 'age' => 35],
]);


$filtered = $collection->filter(function (array $value){
    return $value['age'] >= 26;
});
dd($filtered->all());

//array:2 [▼ 
//  0 => array:2 [▼
//    "name" => "John"
//    "age" => 30
//  ]
//  2 => array:2 [▼
//    "name" => "Doe"
//    "age" => 35
//  ]
//]

whereメソッドとの違い

whereメソッドの実態コードを見てみましょう。中でfilterメソッドを使っています。
単純な絞り込みをする際にはwhereメソッドの方がスマートに書けます。
複雑な絞り込みの際にはfilterメソッドを使いましょう。

public function where($key, $operator = null, $value = null)
{
    return $this->filter($this->operatorForWhere(...func_get_args()));
}

contains

containsメソッドは、指定した条件に一致する要素が存在する場合にtrueを返します。
filterメソッドのようにコールバック関数を引数に与える事も可能です

$collection = collect([
    ['name' => 'John', 'age' => 30],
    ['name' => 'Jane', 'age' => 25],
    ['name' => 'Doe', 'age' => 35],
]);

dd($collection->contains('age',25));
// 結果:
//true
$collection = collect([1, 2, 3, 4, 5]);

$collection->contains(function (int $value, int $key) {
    return $value > 5;
});
// 結果:
// false

pluck

pluckメソッドは指定したキーの値だけを取得します。
配列を引数に渡して複数のキーの値を取り出すことも出来ます。

$collection = collect([
    ['name' => 'John', 'age' => 30],
    ['name' => 'Jane', 'age' => 25],
    ['name' => 'Doe', 'age' => 35],
]);

$names = $collection->pluck('name');
dd($names->all());
$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

$plucked = $collection->pluck('name', 'product_id');

dd($plucked->all());

// 結果:
['prod-100' => 'Desk', 'prod-200' => 'Chair']

isEmpty

isEmptyメソッドは、collectionが空の場合にtrueを返します。
逆に空じゃない時にtrueを返すisNotEmpty()もあります。

$collection = collect([
    ['name' => 'John', 'age' => 30],
    ['name' => 'Jane', 'age' => 25],
    ['name' => 'Doe', 'age' => 35],
]);

dd($collection->isEmpty());

// 結果:
// false

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1