nazolabo

フリーランスのWebエンジニアが近況や思ったことを発信しています。

Laravel(5.0)のCollection

LaravelでDBからリストを取得したりすると、通常の配列ではなく、Collectionというオブジェクトが返ってくる。

これはPHPの配列をラップしたもので、便利な機能がいろいろ用意されている。配列をあんなことやこんなことしたいのにPHPがunkoで面倒!ということも通常に比べて大幅に少ない。ただし処理コストは少し高め(配列をラップするオブジェクトを毎回作ることになるので)。とはいえどうせDBから取得した場合はこれになっているので、遠慮なく使おう。

いろいろあるが、覚えるのが面倒であれば普通に配列として扱うのが良い。ArrayAccessとかIteratorとか実装されているので、ほとんどの場合は普通の配列と同じ感覚で扱える。無理に覚える必要はない。

通常のCollection

Illuminate\Support\Collectionのほう。

make($items = null)

Collectionを新しく作成する。

all()

要素を全て返す。どうしても配列として扱いたい場合に使おう。(ほとんどの場合で必要ない)

collapse()

要素が全て配列またはCollectionから構成されているCollectionの場合、それを一次元に展開する。 つまり、[[1, 2], [3, 4], [5, 6]][1, 2, 3, 4, 5, 6]になるイメージ。 後述のflatten()のほうが使いやすいかも。

contains($key, $value = null)

検索メソッドだが引数によって挙動が変わる。

  • $keyスカラー値の場合はin_array相当。(つまり$keyの値をリストから検索する)
  • $keyがCallableの場合は$this->first($key)相当。(firstについては後述)
  • $valueを指定した場合は、$key番目の要素が$valueかどうかを判定する。

diff($items)

array_diff相当。

each(callable $callback)

foreachができる。DB::select('...')->get()->each(function($item) { ... });とか書ける!PHPだとあまりいらないかも…。

fetch($key)

$keyで値を絞り込む。$keyは文字列で、.で区切ると階層指定できる。この.区切りはLaravelではよく使われている(config、data_get等)。

filter(callable $callback)

array_filter相当。

where($key, $value) / whereLoose($key, $value)

DBのwhere的な感覚で、$key === $valueのものを検索して返す。==で検索したい場合はwhereLooseを使う。

first(callable $callback = null, $default = null)

要素の最初の値を返す。

flatten()

collapse()と基本的には同じだが、「要素が全て配列またはCollection」の制限がない。

flip()

array_flip相当。

forget($key)

unsetと同じ。

get($key, $default = null)

普通の配列アクセスと同じ。存在しなければ$defaultを返す。

groupBy($groupBy)

いわゆるDBのgroupByのように、$groupByで絞り込んだリストのリストを返す。

$groupByを無名関数にした場合は、function($value, $key)が渡るので、これの戻り値でグルーピングする。

keyBy($keyBy)

groupByに似ているが、こちらは一次元配列として返す。つまりDISTINCTに近い。

has($key)

isset($array[$key])と同じ。

implode($value, $glue = null)

implode相当。 第二引数を指定すると、$this->lists($value)したものを$glueimplodeする。

intersect($items)

array_intersect相当。

isEmpty()

配列が空かどうかを返す。

keys()

キーのリストを返す。

last()

要素の最後の値を返す。

map(callable $callback)

eachと基本的に同じだが、こちらは非破壊(とは言ってもCollectionそのものが非破壊なだけなのであまり意味はないが、この後にforget()とか実行すると変わってくる)。あとfunctionにkeyが入る。->map(function($item, $key) {})

merge($items)

array_merge相当。

forPage($page, $perPage)

pagination用に分割したリストを返す。$pageが現在のページ番号(1起点)、$perPageが1ページに表示する数。

pop()

array_pop相当。最後の要素を返してそれを抜く。

prepend($value)

array_unshift相当。最初に要素を足す。

push($value)

array_push相当(内部ではarray_pushはしていない)。最後に要素を足す。

pull($key, $default = null)

$keyで検索した値を取得し配列から抜く。

put($key, $value)

$key$valueをセットする。$list[$key] = $value;と同じ。

random($amount = 1)

$amountの数の配列をランダムに取得する。

reduce(callable $callback, $initial = null)

array_reduce相当。

reject($callback)

  • $callbackfunction(配列の値)の場合、返す値が trueのものを除去する
  • $callbackがそれ以外の場合、$callbackと配列の値が ==で一致するものを除去する

count()

数を返す。つまりcount($objects);とか書かないで、$objects->count();と書ける。

toArray()

中身を全て配列にして返す。中身がobjectだった場合は、そのobjectにtoArray()が実装されている必要がある。

toJson($options = 0)

toArray()したものをjson形式として返す。

shuffle()

shuffle($array)と同じ。

shift()

array_shift($array)と同じ。

slice($offset, $length = null, $preserveKeys = false)

array_slice相当。

chunk($size, $preserveKeys = false)

array_chunk相当。

sort(callable $callback)

uasort相当。callbackをさくっと書く場合はこれ。

sortBy($callback, $options = SORT_REGULAR, $descending = false)

  • $callbackfunction(配列の値, 配列のキー)を入れた場合は、そのfunctionで返した値をソートキーとしてソートを行う。
  • $callbackが文字列の場合、その文字列でdata_getを行い、それで取得できた値でソートを行う。

sortByDesc($callback, $options = SORT_REGULAR)

sortBy$descending = true相当。

splice($offset, $length = 0, $replacement = [])

array_splice相当。

sum($callback = null)

  • $callbacknullの場合はそのままarray_sumを行う。
  • $callbackが文字列の場合はdata_getで取得した値を合計する。
  • $callbackfunction(配列の値)の場合は、functionで返した値を合計する。

take($limit = null)

$limitが正の値の場合は先頭から、負の値の場合は最後から、指定した件数を取得する。

transform(callable $callback)

array_map相当。mapと違い自身を破壊する。(mapは新しいインスタンスを返す)

unique()

array_unique相当。

values()

array_values相当。

DB用Collection

Illuminate\Database\Eloquent\Collectionのほう。Illuminate\Support\Collectionを継承している。DBからオブジェクトリストを取得した場合はこれが返る。

SQLを書かなくてもある程度絞込することが簡単にできる。既にデータを取得済みで絞込をしたい場合、わざわざSQLを発行して絞込をしなくても良い。

contains($key, $value = null)

PKを軸に検索するようになる。

toBase()とかを使ってobjectでないCollectionになった時にこれを呼ぶとエラーになる。悲しい。そんな状態になったら素直にall()してin_array()しよう。

find($key, $default = null)

Collection内のModelをgetKey()した値が$keyだった場合にそのModel、無ければ$defaultを返す。複数あれば最初に見つかるものを返す。

getKey()は通常、Eloquent ModelのPKを指すので、つまりPKで検索して1つ返す、つまりModel::find()と同じ動作と言える。

load($relations)

relationを一度に全て取得する。Model::with('relation')->get()withを後から行うような感じ。詳しくはこちら

toBase()

\Illuminate\Support\Collectionにラップして返す。継承元の動作をさせたい場合に使おう。

getDictionary($items = null)

Primary Keyをキーにした配列として返す

add($item)

$itemを要素に追加する。array_push相当と言える。(何故Baseのほうに存在しないのか謎)

modelKeys()

PKのリストを返す。

only($keys)

指定PKのみのリストを返す。配列で複数指定もできる。

except($keys)

指定PKを除外したリストを返す。配列で複数指定もできる。