Заполнение базы данных в файле миграции Laravel
Я только изучаю Laravel и имею рабочий файл миграции, создающий таблицу пользователей. Я пытаюсь заполнить запись пользователя в рамках миграции:
public function up()
{
Schema::create('users', function($table){
$table->increments('id');
$table->string('email', 255);
$table->string('password', 64);
$table->boolean('verified');
$table->string('token', 255);
$table->timestamps();
DB::table('users')->insert(
array(
'email' => 'name@domain.com',
'verified' => true
)
);
});
}
но я получаю следующую ошибку при запуске php artisan migrate
:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist
это очевидно, потому что Artisan еще не создал таблицу, но вся документация, похоже, говорит о том, что есть способ использовать Fluent Query для заполнения данных в рамках миграции.
кто-нибудь знает как? Спасибо!
5 ответов
не помещайте DB::insert() внутри схемы:: create(), потому что метод create должен закончить создание таблицы, прежде чем вы сможете вставить материал. Попробуйте вместо этого:
public function up()
{
// Create the table
Schema::create('users', function($table){
$table->increments('id');
$table->string('email', 255);
$table->string('password', 64);
$table->boolean('verified');
$table->string('token', 255);
$table->timestamps();
});
// Insert some stuff
DB::table('users')->insert(
array(
'email' => 'name@domain.com',
'verified' => true
)
);
}
Я знаю, что это старый пост, но так как он появляется в поиске google, я думал, что поделюсь некоторыми знаниями здесь. @erin-geyer отметил, что смешивание миграций и сеялок может создавать головные боли, а @justamartin возразил, что иногда вы хотите/должны заполнять данные как часть вашего развертывания.
Я бы сделал еще один шаг и сказал, что иногда желательно иметь возможность последовательно развертывать изменения данных, чтобы вы могли, например, развертывать в staging, видеть, что все ну, а затем развернуть на производство с уверенностью тех же результатов (и не нужно забывать запускать какой-то ручной шаг).
тем не менее, все еще есть ценность в разделении семян и миграции, поскольку это две связанные, но разные проблемы. Наша команда пошла на компромисс, создав миграции, которые вызывают сеялки. Это выглядит так:
public function up()
{
Artisan::call( 'db:seed', [
'--class' => 'SomeSeeder',
'--force' => true ]
);
}
Это позволяет выполнить семя один раз, как миграция. Можно также реализовать логику, которая предотвращает или увеличивает поведение. Например:
public function up()
{
if ( SomeModel::count() < 10 )
{
Artisan::call( 'db:seed', [
'--class' => 'SomeSeeder',
'--force' => true ]
);
}
}
это, очевидно, условно выполнить сеялку, если есть менее 10 SomeModels. Это полезно, если вы хотите включить сеялку в качестве стандартного сеялки, которая выполняется при вызове artisan db:seed
а также при миграции, чтобы вы не "удвоились". Вы также можете создать обратный сеялку, чтобы откаты работали так, как ожидалось, например
public function down()
{
Artisan::call( 'db:seed', [
'--class' => 'ReverseSomeSeeder',
'--force' => true ]
);
}
второй параметр --force
требуется, чтобы сеялка могла работать в производственная среда.
вот очень хорошее объяснение того, почему использование сеялки базы данных Laravel предпочтительнее использования миграций:http://laravelbook.com/laravel-database-seeding/
хотя, следуя инструкциям по официальной документации, гораздо лучше, потому что реализация, описанная в приведенной выше ссылке, кажется, не работает и является неполной. http://laravel.com/docs/migrations#database-seeding
Это должно делать то, что вы хотите.
public function up()
{
DB::table('user')->insert(array('username'=>'dude', 'password'=>'z19pers!'));
}
try: (не проверено)
public function up()
{
Schema::table('users', function($table){
$table->increments('id');
$table->string('email', 255);
$table->string('password', 64);
$table->boolean('verified');
$table->string('token', 255);
$table->timestamps();
$table->insert(
array(
'email' => 'name@domain.com',
'verified' => true
)
);
});
}