Help us understand the problem. What is going on with this article?

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

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

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

前提条件

Laravel5.7をインストール&設定済み
PHPをある程度理解している
Modelを作成済み

Seederとは

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

早速使ってみる

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

php artisan make:seeder ProductsTableSeeder

そうするとdatabase/seeds/の中に自動生成されます。

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

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

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 .'の説明',
            ]);
        }
    }
}

それじゃ簡単に解説。

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

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

ProductsTableSeeder
    public function run()
    {
    }

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

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

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

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

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

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だけを実行)

php artisan db:seed --class=ProductsTableSeeder

あれ?エラーが出た。

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

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

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',
    ];
}

これで再度実行!!

Database seeding completed successfully.

成功です。

最後に

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away