laravel6でseederを実行するのに、
初めてfactorieを使用したのでまとめます。
factories=seederファイルを挿入するDBを作成する工場のイメージ。
①マイグレーションの作成。
②シーダーの作成。
③モデルの作成。
④ファクトリーの作成。
⑤seederの実行。
の順番に作成しました。
①マイグレーションの作成。
・作成したマイグレーションファイル。
$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();
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');
});
Schema::create('genres', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
②シーダーの作成。
<?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);
};
}
}
<?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());
を記述。
③モデルの作成。
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を記述。
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を記述。
④ファクトリーの作成。
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