Laravelでシーダーを利用してデータベースに値を登録する方法

seederとは、ファイルに書いた内容をデータベースに任意の値を登録できる便利なやつ。

ダミーデータや、あらかじめ入れておきたいデータなどを一括で格納することができる。

初期データの登録に使うイメージ。

具体的な利用方法について解説。

コマンドを叩く場所は、アプリのプロジェクトのディレクトリ。

Docker環境ならコンテナの中から行う。

やり方

例としてUsersテーブルに何かしらのレコードを追加したい場合なら、

php artisan make:seed UserTableSeeder

のようなコマンドを叩く。

UserTableSeederでも、UsersTableSeederでもどっちでもいい。

あくまでただのファイル名の話なので。

//プロジェクトディレクトリ/database/seeders/UserTableSeeder.php
use Illuminate\Support\Facades\DB;//追記
use DateTime;//追記(現在の日時を取得したいなら必要)

class UserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
            //追記
            DB::table('users')->insert([//ここは正確なテーブル名
                'name' => 'yamada',
                'email' => 'yamada@yahoo.co.jp',
                    'password' => '$2y$10$lMS.w4oNg0PPeewefwea',//暗号化後のパスワード
                'role'=>'administrator',
                    'created_at' => new DateTime(),
                    'updated_at' => new DateTime(),
            ]);
    }
}

created_atとupdated_atも指定しないとnullになってしまう。

別にnullで構わないなら指定しなくてもいい。

【laravel】シーダーにtimestamp()を付する - Qiita


複数のレコードを登録したい場合は、この記事を参考に。(外部サイト)

Laravel6.0(PHP7.3)+MySQL+Laradockで簡易的なECサイトを作る②|mukae|note


シーダーの存在を親ファイルに宣言して知らせる

<?php
//プロジェクトディレクトリ/database/seeders/DatabaseSeeder.php
namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserTableSeeder::class);//追記
    }
}

php artisan db:seed

で投稿する。

エラーになる場合

php artisan db:seedを叩いた後にエラーが出る場合。

A column was not found:

A column was not found: You might have forgotten to run your migrations. You can run your migrations using php artisan migrate.

プロジェクトディレクトリ/database/seeders/UserTableSeeder.php

DB::table('users')->insert([

のusersの部分が正しいテーブル名になっているか確認が必要。


Class "Database\Seeders\DB" not found

のエラーが出る場合

プロジェクトディレクトリ/database/seeders/UserTableSeeder.php冒頭の

use Illuminate\Support\Facades\DB;

が抜けてる

LaravelのSeeder実行時に「Class 'Database\Seeders\DB' not found」エラーが出たときの対処法 - Qiita


Class "Database\Seeders\DateTime" not found

のエラーが出る場合

プロジェクトディレクトリ/database/seeders/UserTableSeeder.php冒頭の

use DateTime;

が抜けてる。

日時を取得するための

new DateTime()関数を利用したければ必要になる。

よく気になるポイント

シーダーを反映させると投稿済みの既存のレコードは破壊されるのか

DB::table('rejected_reasons')->truncate();
の記述がシーダー付ファイルにあるかどうかによるかも。また調べる。

同じシーダーファイルに値を追記してもう一度反映させるとレコードがダブってしまうのか

DB::table('rejected_reasons')->truncate();
の記述がシーダー付ファイルにあるかどうかによるかも。また調べる。

モデルにカラム編集を許可する記述は必要か

Users.phpなどに

protected $fillable = [
        'name',
        'email',
        'password',
        'icon',
        'created_at',
        'updated_at',
        'role',
    ];

のようにいちいち許可設定を書く必要があるか

いらん。

fillableとかはあくまでブラウザとかから投稿するときの話なので。

無制限に質問可能なプログラミングスクール!

万が一転職できない場合は、転職保障全額返金できるコースもあり!!

無制限のメンター質問対応

 

DMMウェブキャンプでプログラミングを学習しませんか?

独学より成長スピードをブーストさせましょう!

 

まずは無料相談から!

おすすめの記事