LoginSignup
0
0

More than 1 year has passed since last update.

laravelでファクターを使用してseederを実行した

Posted at

laravel6でseederを実行するのに、
初めてfactorieを使用したのでまとめます。

factories=seederファイルを挿入するDBを作成する工場のイメージ。

①マイグレーションの作成。
②シーダーの作成。
③モデルの作成。
④ファクトリーの作成。
⑤seederの実行。
の順番に作成しました。

①マイグレーションの作成。
・作成したマイグレーションファイル。

users_table
$table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->string('image_path')->nullable();
            $table->string('text')->nullable();
            $table->rememberToken();
            $table->timestamps();
movies_table
Schema::create('movies', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('image_path');
            $table->string('title');
            $table->string('director');
            $table->string('release');
            $table->string('evaluation');
            $table->string('viewing');
            $table->string('review');
            $table->unsignedBigInteger('user_id');
            $table->timestamps();

            //外部キー制約、user情報が削除されたら映画テーブルも削除される
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
movies_table
Schema::create('genres', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();
        });

②シーダーの作成。

GenresTableSeeder
<?php

use Illuminate\Database\Seeder;
use Carbon\Carbon;
use App\Genre;

class GenresTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $now = Carbon::now();
        $dataArray = [
            [
                'name' => 'アニメ',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => 'ドラマ',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => '恋愛',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => 'ホラー',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => 'アート・コンテンボラリー',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => '戦争',
                'created_at' => $now,
                'updated_at' => $now,
            ],
        ];
        foreach($dataArray as $data) {
            DB::table('genres')->insert($data);
        };
    }
}

UsersTableSeeder
<?php

use Illuminate\Database\Seeder;
use App\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(User::class, 50)
            ->create()
            ->each(function ($user) {
                $user->movies()->save(factory(App\Movie::class)->make());
            });
    }
}

Moviesテーブルの中に外部キーを使用するので、

->each(function ($user) {
                $user->movies()->save(factory(App\Movie::class)->make());

を記述。

③モデルの作成。

User.php
protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function movies()
    {
        return $this->hasMany(Movie::class);
    }

userテーブル→親。
movieテーブル→子。
の関係なので、hasManyを記述。

Movie.php
class Movie extends Model
{
    protected $fillable = ['image_path','title','director','release','evaluation','viewing','review','user_id'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Movieテーブル→子なので、
belongsToを記述。

④ファクトリーの作成。

UserFactory.php
factory->define(User::class, function (Faker $faker) {
    return [
        //名前を入力
        'name' => $faker->name(),
        //メールアドレスを入力
        'email' => $faker->unique()->safeEmail,
        //seeder実行時の時間を入力
        'email_verified_at' => now(),
        //パスワードを入力
        'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        //10文字の数字とアルファベットをランダムに自動入力
        'image_path' => Str::random(10),
        //255文字を自動入力
        'text' => $faker -> realText(255),
        //10文字の数字とアルファベットをランダムに自動入力
        'remember_token' => Str::random(10),
    ];
});

既存のFactoryファイルにimage_pathとtxetを記述。
ファクトリの記述方法はこちらに詳しくまとめられております。
https://qiita.com/shin1kt/items/022c2b8d576c203d8cf1
https://qiita.com/kurosuke1117/items/c672405ac24b03af2a90
https://qiita.com/rope19181/items/a0df89275bb24193d4ac

⑤seederの実行。
seederを実行する前に

composer dump-autoload

コマンドを実行。
その後、

php artisan db:seed

マイグレーションとシーダーを同時に実行する場合。

 php artisan migrate:fresh --seed

0
0
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
0
0