はじめに
Laravelでシーディングのテストデータが複数ある場合、コードが冗長になってしまいます。
今回はforeachを使ってスマートにまとめる書き方をお伝えします。
今回の例ではCarbonを使っておりますが、Carbonについて詳しくは以下の記事が参考になります。
PHPで日付時刻処理を書くならCarbonを使うべき - Qiita
対象
LaravelでWebアプリを作っている初学者向けの内容となっております。
本記事はLaravel青本をベースに書いております。
PHPフレームワークLaravel入門 第2版 | 津耶乃, 掌田 |本 | 通販 | Amazon
環境
Laravel:6系
PHP:7.4.13
それではまず通常のシーダーファイルの書き方の一例です。
PostsTableSeeder.php
class PostsTableSeeder extends Seeder
{
public function run()
{
$param = [
'name' => '竈門 炭治郎',
'body' => '水の呼吸',
'created_at' => Carbon::now(),
'updated_at' => Carbon::now()
];
DB::table('sizes')->insert($param);
$param = [
'name' => '我妻 善逸',
'body' => '雷の呼吸',
'created_at' => Carbon::now(),
'updated_at' => Carbon::now()
];
DB::table('sizes')->insert($param);
$param = [
'name' => '嘴平 伊之助',
'body' => 'ケダモノの呼吸',
'created_at' => Carbon::now(),
'updated_at' => Carbon::now()
];
DB::table('posts')->insert($param);
}
}
created_at
とupdated_at
が同じなのに何度も書いているのはあまりスマートではありません。
foreachを使って以下のように書くことができます。
PostsTableSeeder.php
class PostsTableSeeder extends Seeder
{
public function run()
{
$params =
[
[
'name' => '竈門 炭治郎',
'body' => '水の呼吸'
],
[
'name' => '我妻 善逸',
'body' => '雷の呼吸'
],
[
'name' => '嘴平 伊之助',
'body' => 'ケダモノの呼吸'
]
];
$now = Carbon::now();
foreach ($params as $param) {
$param['created_at'] = $now;
$param['updated_at'] = $now;
DB::table('posts')->insert($param);
}
}
}
内容が変わるテストデータ(今回は'name'
と'body'
)を$params
の配列に入れます。
そして共通項目('created_at'
と'updated_at'
)をforeachの中で書きます。
こうすることで無駄な記述を減らすことができ、見事スマートなシーダーファイルの完成です!
いかがでしたでしょうか?
今回はテストデータが少ないのであまり変わりないですが、共通する項目が多いほどすっきりと可読性の高いコードになります。
是非お試しいただければと思います。