質問: $hoge->select('hoge.*')->join('piyo','hoge.id', '=', 'piyo.hoge_id')->get(); /** 検索結果は2件で以下のような形 object(Illuminate\Database\Eloquent\Collection)[80] protected 'items' => array (size=2) 0 => object(App\Models\Hoge), // id:4 1 => object(App\Models\Hoge) // id:5 */ $result1->merge($result2); /** 求める形は以下 object(Illuminate\Database\Eloquent\Collection)[80] protected 'items' => array (size=5) 0 => object(App\Models\Hoge), // id:1 1 => object(App\Models\Hoge), // id:2 2 => object(App\Models\Hoge) // id:3 3 => object(App\Models\Hoge), // id:4 4 => object(App\Models\Hoge) // id:5 */ ``` しかし実際に出力された値は ``` $result1->merge($result2); /** 求める形は以下 object(Illuminate\Database\Eloquent\Collection)[80] protected 'items' => array (size=1) 4 => object(App\Models\Hoge) // id:5 */ ``` 以下のようにコードを変更すると求める値が取得できました。 ``` collect($result1->all())->merge($result2); ``` しかしマージのために新たに(しかも一方だけ)コレクションクラスでラップするのも見栄えが悪く無駄な処理をしている気がします。 何か `$result1->xxx($result2);` のように簡潔な形で求めるコレクションを取得する方法はないでしょうか。 よろしくお願いいたします。
回答: Laravel5.5で、コレクションのconcatメソッドを利用すると2つが結合したデータを得られるかと思います。 $result1->concat($result2); Laravel 5.5 コレクション concat() Illuminate/SupportのCollectionクラスと、それを継承するlluminate/Database/EloquentのCollectionでは、mergeメソッドの実装が異なっているみたいなので注意が必要ですね。 Illuminate/Support\Collection lluminate/Database/Eloquent ``` //以下は添字配列の場合は、結果が違う $items = $data1->merge($data2); //キー重複分が上書き $items = collect($data1)->merge($data2); //array_mergeを内部で利用 dd($items->toArray()); ```