LaravelのCollections(コレクション)入門

Posted in Laravel on 9月 23, 2016

LaravelのCollectionには、さまざまなメソッドが準備されており、使いこなすことができれば、Laravelを使って構築するアプリの手間も軽減することができます。

Collectionには、かなりの数のメソッドが存在するのですべての紹介はできませんが、基本を理解して、なぜCollectionは重宝がられるのかメソッドを通して知って頂ければと思います。

【内容】

  • Collectionの作成
  • Eloquent ORMからCollection
  • CollectionからJSONへの変換
  • Collectionから配列への変換
  • 配列からCollectionへの変換
  • JSONからCollectionへの変換

Collectionの作成

Collectionの作成には、Helper関数で行う方法とIlluminate\Support\Collectionクラスから行う2つの方法があります。

Helper関数collect()での作成

下記のようにcollect()メソッドを使用するだけで、Collectionは作成できます。

$collection = collect(['1','2','3']);

dd($collection);
Collection {#1794 ▼
  #items: array:3 [▼
    0 => "1"
    1 => "2"
    2 => "3"
  ]
}

Illuminate\Support\Collectionクラスからの作成

Illuminate\Support\Collectionクラスから作成する場合は、名前空間のUSEを使う必要があります。

use Illuminate\Support\Collection;
$collection = new Collection(['1','2','3']);

 dd($collection);
Collection {#1794 ▼
  #items: array:3 [▼
    0 => "1"
    1 => "2"
    2 => "3"
  ]
}

Collectionの作成は、Helper関数collection()で作成したほうがより簡単に行うことができます。

Collectionのitemの数を知りたい時は、countメソッドを使用すれば可能です。

$collection = collect(['1','2','3']);

dd($collection->count());
3

Eloquent ORMからCollection

データベースの中に格納されているデータをEloquent ORMからすべてCollectionとして取得することができます

ここでは、brandとbrand_nameの2列からなるbrandsテーブルのデータを取得します。

$brands = Brand::all();

 dd($brands);

collectionの表示

items内にあるattributesを取得したい場合は、foreachを利用して"->"を使用すれば、Collectionからbrand_nameを取得することができます。

$brands = Brand::all();

foreach ( $brands as $brand){

   dd($brand->brand_name);

}
"ナイキ"

CollectionからJSONへの変換

CollectionをJSONデータにするには、toJSONメソッドを使って簡単に変換を行うことができます。

$brands_json = Brand::all()->toJSON();

dd($brand_json);

toJSONで変換したCollection

echoでCollectionを文字列にキャストすると、JSON変換が自動的に実行され、JSONとして出力されます。 echoだけではなく、Returnでも同様にJSONに変換されます。

echo Brand:all();

echoでキャストしたCollection

return Brand:all();

Collectionから配列への変換

Collectionを配列に変換するためには、toArrayメソッドを使って行うことができます。

$brands_array = Brand::all()->toArray();

 dd($brands_array);
array:8 [▼
  0 => array:5 [▼
    "id" => 1
    "brand" => "Nike"
    "brand_name" => "ナイキ"
    "created_at" => "-0001-11-30 00:00:00"
    "updated_at" => "-0001-11-30 00:00:00"
  ]
  1 => array:5 [▶]
  2 => array:5 [▶]
  3 => array:5 [▶]
  4 => array:5 [▶]
  5 => array:5 [▶]
  6 => array:5 [▶]
  7 => array:5 [▶]
]

配列からCollectionへの変換

Collectionから配列には、toArray()メソッドを使用しましたが、配列からCollectionは、Helper関数を利用して作成します。先程、Collectionから配列へ変換した$brands_arrayをもう一度Collectionに変換します。

$brands_collection = collect($brands_array);

dd($brands_collection);
Collection {#1811 ▼
  #items: array:8 [▼
    0 => array:5 [▼
      "id" => 1
      "brand" => "Nike"
      "brand_name" => "ナイキ"
      "created_at" => "-0001-11-30 00:00:00"
      "updated_at" => "-0001-11-30 00:00:00"
    ]
    1 => array:5 [▶]
    2 => array:5 [▶]
    3 => array:5 [▶]
    4 => array:5 [▶]
    5 => array:5 [▶]
    6 => array:5 [▶]
    7 => array:5 [▶]
  ]
}

Collectionになると、whereメソッドも使えるため、データベースからSQL文のWhere句のように必要なデータのみ取り出すことができます。

$brand = $brands_collection->where('brand','Nike');

 dd($brand);
Collection {#1818 ▼
  #items: array:1 [▼
    0 => array:5 [▼
      "id" => 1
      "brand" => "Nike"
      "brand_name" => "ナイキ"
      "created_at" => "-0001-11-30 00:00:00"
      "updated_at" => "-0001-11-30 00:00:00"
    ]
  ]
}

JSONからCollectionへの変換

JSONからCollectionの方法は、JSONデータを一度json_decode関数で配列にして、配列からCollectionへ変換することによって行うことができます。

$brands_json = Brand::all()->toJSON();

** toJSON()でJSONデータを作成 **

$brands_array = json_decode($brands_json,true);

$brands_collection = collect($brands_array);

dd($brands_collection)
Collection {#1811 ▼
  #items: array:8 [▼
    0 => array:5 [▼
      "id" => 1
      "brand" => "Nike"
      "brand_name" => "ナイキ"
      "created_at" => "-0001-11-30 00:00:00"
      "updated_at" => "-0001-11-30 00:00:00"
    ]
    1 => array:5 [▶]
    2 => array:5 [▶]
    3 => array:5 [▶]
    4 => array:5 [▶]
    5 => array:5 [▶]
    6 => array:5 [▶]
    7 => array:5 [▶]
  ]
}