LoginSignup
3
1

More than 3 years have passed since last update.

【Laravel】シーダーの複数あるテストデータをforeachでスマートに書く

Posted at

はじめに

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_atupdated_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の中で書きます。

こうすることで無駄な記述を減らすことができ、見事スマートなシーダーファイルの完成です!

いかがでしたでしょうか?
今回はテストデータが少ないのであまり変わりないですが、共通する項目が多いほどすっきりと可読性の高いコードになります。

是非お試しいただければと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1