web-dev-qa-db-ja.com

Laravelで複数のコレクションを適切にマージする方法

複数のコレクションを1つにマージしたい。私は解決策を持っています、それは次のとおりです:

_$allItems = $collection1->merge($collection2)
                        ->merge($collection3)
                        ->merge($collection4)
                        ->merge($collection5);
_

これは実際には機能しますが、コレクションの一部またはすべてにオブジェクトが含まれていない場合に問題が発生します。 call to merge() on non objectの行に沿ってエラーが発生します。

実際にすべてのコレクションの配列を作成し、それらの有効性を確認しながら繰り返し処理を試みましたが、機能せず、あまりエレガントではないように感じました。

コレクションの一部またはすべてが空または無効である可能性があることを考慮しながら、複数のコレクションをマージするこのプロセスをエレガントに繰り返すにはどうすればよいですか?感謝!

18
Marcel

私がやったことは、各ステップを分離することでした。コレクションの一部またはすべてが無効であった可能性があるため、マージチェーンによって強制終了されました。

$allItems = new \Illuminate\Database\Eloquent\Collection; //Create empty collection which we know has the merge() method
$allItems = $allItems->merge($collection1);
$allItems = $allItems->merge($collection2);
$allItems = $allItems->merge($collection3);
$allItems = $allItems->merge($collection4);
28
Marcel

同じ質問があったので、次の方法で解決しました。

$clients = ClientAccount::query()->get();
$admins = AdminAccount::query()->get();

$users = collect($clients)->merge($admins)->merge($anotherCollection)->merge(...);
4
Leonid Dashko

コレクションが実際にnullであるか、phpがサポートしている場合は、データに依存します。

    $allItems = $collection1->merge($collection2 ?: collect())
                    ->merge($collection3 ?: collect())
                    ->merge($collection4 ?: collect())
                    ->merge($collection5 ?: collect());

または削減したい:

    $allItems = collect([$collection2, $collection3, $collection4])->reduce(function($arr, $item) {
        if (empty($item) || $item->isEmpty())
            return $arr;
        return $arr->merge($item);
    }, $collection1);

またはプレーンPHPはオーバーヘッドなしで削減します

    $allItems = array_reduce([
        $collection2,
        $collection3,
        $collection4
    ], function($arr, $item) {
        if (empty($item) || $item->isEmpty())
            return $arr;
        return $arr->merge($item);
    }, $collection1);
1
wayne

あなたも試すことができます:

$allItems = collect([
  'collection_1_key' => $collection_1,
  'collection_2_key' => $collection_2,
  'collection_3_key' => $collection_3,
  'collection_4_key' => $collection_4,
]);
0
hawx