はじめに
こんばんは。
今回もlaravelネタです。
paginateしつつデータをgroupbyしたいなってときがあって、それを調べた対応です。
本題
元データはこちらでやってみます。
$paginator = new \Illuminate\Pagination\Paginator(collect([ ['userId' => 10, 'type' => 1, 'name' => 'AAA'], ['userId' => 20, 'type' => 2, 'name' => 'BBB'], ['userId' => 30, 'type' => 3, 'name' => 'CCC'], ['userId' => 40, 'type' => 1, 'name' => 'DDD'], ['userId' => 50, 'type' => 2, 'name' => 'EEE'], ['userId' => 60, 'type' => 3, 'name' => 'FFF'], ['userId' => 70, 'type' => 1, 'name' => 'GGG'], ['userId' => 80, 'type' => 2, 'name' => 'HHH'], ['userId' => 90, 'type' => 3, 'name' => 'III'], ['userId' => 100, 'type' => 1, 'name' => 'JJJ'], ['userId' => 110, 'type' => 2, 'name' => 'KKK'], ['userId' => 120, 'type' => 3, 'name' => 'LLL'], ['userId' => 130, 'type' => 1, 'name' => 'MMM'], ['userId' => 140, 'type' => 2, 'name' => 'NNN'], ['userId' => 150, 'type' => 3, 'name' => 'OOO'], ['userId' => 160, 'type' => 1, 'name' => 'PPP'], ['userId' => 170, 'type' => 2, 'name' => 'QQQ'], ['userId' => 180, 'type' => 3, 'name' => 'RRR'], ['userId' => 190, 'type' => 1, 'name' => 'SSS'], ['userId' => 200, 'type' => 2, 'name' => 'TTT'], ['userId' => 210, 'type' => 3, 'name' => 'UUU'], ['userId' => 220, 'type' => 1, 'name' => 'VVV'], ['userId' => 230, 'type' => 2, 'name' => 'WWW'], ['userId' => 240, 'type' => 3, 'name' => 'XXX'], ['userId' => 250, 'type' => 1, 'name' => 'YYY'], ['userId' => 260, 'type' => 2, 'name' => 'ZZZ'], ]), 5);
通常で取得するとこうなります。
dd($paginator->items()); /** * array:5 [▼ * 0 => array:3 [▼ * "userId" => 10 * "type" => 1 * "name" => "AAA" * ] * 1 => array:3 [▼ * "userId" => 20 * "type" => 2 * "name" => "BBB" * ] * 2 => array:3 [▼ * "userId" => 30 * "type" => 3 * "name" => "CCC" * ] * 3 => array:3 [▼ * "userId" => 40 * "type" => 1 * "name" => "DDD" * ] * 4 => array:3 [▼ * "userId" => 50 * "type" => 2 * "name" => "EEE" * ] * ] */
これをtypeでgroupbyしてみます。
$paginator->setCollection($paginator->groupBy('type')); dd($paginator->items()); /** * array:3 [▼ * 1 => Illuminate\Support\Collection {#1370 ▼ * #items: array:2 [▼ * 0 => array:3 [▼ * "userId" => 10 * "type" => 1 * "name" => "AAA" * ] * 1 => array:3 [▼ * "userId" => 40 * "type" => 1 * "name" => "DDD" * ] * ] * #escapeWhenCastingToString: false * } * 2 => Illuminate\Support\Collection {#1388 ▼ * #items: array:2 [▼ * 0 => array:3 [▼ * "userId" => 20 * "type" => 2 * "name" => "BBB" * ] * 1 => array:3 [▼ * "userId" => 50 * "type" => 2 * "name" => "EEE" * ] * ] * #escapeWhenCastingToString: false * } * 3 => Illuminate\Support\Collection {#1374 ▼ * #items: array:1 [▼ * 0 => array:3 [▼ * "userId" => 30 * "type" => 3 * "name" => "CCC" * ] * ] * #escapeWhenCastingToString: false * } * ] */
重要なのは setCollectionで内部のitemsを上書きすることみたいです。
/** * Set the paginator's underlying collection. * * @param \Illuminate\Support\Collection $collection * @return $this */ public function setCollection(Collection $collection) { $this->items = $collection; return $this; }
終わりに
以外に簡単でした。