[Laravel]Seederで複数のレコードの配列を分かりやすく定義する

カテゴリ: 未分類

PHPのLaravelフレームワークでシステム開発を行っているとseederなどで、複数のデータを"列名=>値"の連想配列を配列の形で用意したい場合があります。素直に連想配列のArrayを作ると、”列名"の部分に何回も同じ列名を書く必要があり、コードが冗長になりがちです。

このような場合はLaravelのcollect()が用意しているmap(), combine(), toArray()を利用することでシンプルにテストデータを用意することができます

$columns = collect(['id', 'name', 'email']);
$values = collect([
    [1, 'alice', 'alice@example.com'],
    [2, 'bob', 'bob@example.co.jp'],
]);

$rows = $values->map(fn($x) => $columns->combine($x))->toArray();
dump($rows);

このコードのdump()結果は以下のようになり、1行のコードで連想配列のArrayを用意することができました。

array:2 [
  0 => array:3 [
    "id" => 1
    "name" => "alice"
    "email" => "alice@example.com"
  ]
  1 => array:3 [
    "id" => 2
    "name" => "bob"
    "email" => "bob@example.co.jp"
  ]
]

サンプルコード中にあるfn()は、PHP7.4以降のみで使用可能なので、7.3以前では以下のように書く必要がありまs

$rows = $values->map(function ($x) use ($columns) {
    return $columns->combine($x);
)->toArray();

生成したデータをseederの初期データとして使いたい場合は、$rowsを下記の形でinsertすればよいです

DB::connection()->table('users')->insert($rows);

Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です