Заполнение базы данных в файле миграции 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 возразил, что иногда вы хотите/должны заполнять данные в рамках вашего развертывания.
Я бы пошел еще на один шаг и сказал, что иногда желательно иметь возможность последовательно развертывать изменения данных, чтобы вы могли, например, развертывать на этапе, видеть, что все это ну, а затем развернуть на производство с уверенностью тех же результатов (и не нужно помнить, чтобы запустить какой-то ручной шаг).
тем не менее, все еще есть ценность в разделении семени и миграции, поскольку это две связанные, но разные проблемы. Наша команда пошла на компромисс, создав миграции, которые вызывают сеялки. Это выглядит так:
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!')); }
попробовать: (не проверял)
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 ) ); }); }