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)
したものを$glue
でimplode
する。
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)
$callback
がfunction(配列の値)
の場合、返す値が 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)
$callback
にfunction(配列の値, 配列のキー)
を入れた場合は、そのfunctionで返した値をソートキーとしてソートを行う。$callback
が文字列の場合、その文字列でdata_get
を行い、それで取得できた値でソートを行う。
sortByDesc($callback, $options = SORT_REGULAR)
sortBy
の$descending = true
相当。
splice($offset, $length = 0, $replacement = [])
array_splice
相当。
sum($callback = null)
$callback
がnull
の場合はそのままarray_sum
を行う。$callback
が文字列の場合はdata_get
で取得した値を合計する。$callback
がfunction(配列の値)
の場合は、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を除外したリストを返す。配列で複数指定もできる。