【Laravel5.7】Seederfor文を使って簡単なテストデータを作成してみる。



##大量データが必要になるときわざわざ考えてSQL文を書かなくてもいいようにLaravelのSeederを使ってみましょう。


- 前提条件
- Seederとは
- 早速使ってみる
- for文で好きな数を入れてみる
- 最後に



###前提条件
Laravel5.7をインストール＆設定済み
PHPをある程度理解している
Modelを作成済み



###Seederとは
Seeder(シーダー)と読みます！
Laravelに最初から用意されているライブラリ。
マイグレーションと同様DBを管理する機能の一つ。
SQL文を書かなくても簡単にDBに自由なテストデータを導入することができる。



###早速使ってみる



`Products`という商品テーブルで試してみます。
ターミナルでLaravelをインストールしているディレクトリに移動して以下のコマンドを入力します。



```terminal
php artisan make:seeder ProductsTableSeeder
```



そうすると`database/seeds/`の中に自動生成されます。
>その中に`DatabaseSeeder.php`というものがデフォルトで用意されていますが、
これは作成したシーダーファイルを登録するものになります。



###for文で好きな数を入れてみる



```php:ProductsTableSeeder
<?php

use Illuminate\Database\Seeder;
use App\Product;

class ProdcutsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {

        for ($i = 1; $i < 6; $i++)
        {
            Category::create([
                //商品の名前
                'product_name' => '商品'. $i,
                //商品の説明
                'product_description' => '商品'. $i .'の説明',
            ]);
        }
    }
}
```



それじゃ簡単に解説。



```php:ProductsTableSeeder
use Illuminate\Database\Seeder;
use App\Product;
```



自動生成された時は`use Illuminate\Database\Seeder;`だけが定義されています。
そこにモデルの`App/Product.php`を定義しています。




```php:ProductsTableSeeder
    public function run()
    {
    }
```



シーディング処理には`run`メソッド一つだけが用意されています。
このメソッドの中にレコードを作成するための処理を書いていけばいいということですな。。




```php:ProductsTableSeeder
        for ($i = 1; $i < 6; $i++)
        {
            Category::create([
                //商品の名前
                'product_name' => '商品'. $i,
                 //商品の説明
                'product_description' => '商品'. $i .'の説明',
            ]);
        }
```



レコードが５件欲しかったのと、1からカウントしたかったので、for文はこのような形になってます。
こうすることで1~5の数字が商品一つ一つに振られますね。



`Category::create`の配列の中身がカラム名ですね。
その中に商品名と商品説明のデータを挿入しています。
**※ちなみにオートインクリメントは既述しなくても自動で付与されます。**



さて先ほど少し触れた`database/seeds/DatebaseSeeder.php`を開いて
シーダーファイルに`ProductsTableSeeder`を呼び出す処理を書いていきましょう。



```php:database/seeds/DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        //デフォルトではUsersテーブルがコメントアウトされている。
        // $this->call(UsersTableSeeder::class);

        //Usersテーブルを使用するなら上記をコメントインして追記しても良い
        $this->call(ProductTableSeeder::class);
    }
}
```



これで準備ができたので、ターミナルを開いて以下を記述
(ProductClassだけを実行)



```terminal
php artisan db:seed --class=ProductsTableSeeder
```



あれ？エラーが出た。



```terminal
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list'
```



どうやら`Timestamp`がデフォルトでONになっているようです。
Modelを開いて以下を追記しましょう。



```php:Product.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    //TimestampをOFFにする
    public $timestamps = false;

    protected $fillable = [
        'id',
        'product_name',
        'product_description',
    ];
}

```



これで再度実行！！




```terminal
Database seeding completed successfully.
```



成功です。




###最後に


CakePHPとSymfony使ってましたが、比べ物にならないくらいLaravel便利で分かりやすいです。
~~本当にク○Symonyがベースなのかと疑ってしまう~~