Я просто изучаю 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' => '[email protected]',
'verified' => true
)
);
});
}
Но при запуске php artisan migrate
появляется следующая ошибка:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist
Это, очевидно, потому, что Artisan еще не создал таблицу, но вся документация, похоже, говорит о том, что существует способ использования Fluent Query для заполнения данных как часть миграции.
Кто-нибудь знает как? Спасибо!
Не помещайте DB:: insert() внутри схемы Schema:: 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' => '[email protected]',
'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 Database Seeder предпочтительнее использования Migrations: 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::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('label', 256);
$table->timestamps();
$table->softDeletes();
});
$this->postCreate('admin', 'user');
}
private function postCreate(string ...$roles) {
foreach ($roles as $role) {
$model = new Role();
$model->setAttribute('label', $role);
$model->save();
}
}
При таком решении поля меток времени будут генерироваться Eloquent.
РЕДАКТИРОВАТЬ: лучше использовать систему сеялки для различения структуры базы данных и заполнения базы данных.
попробуйте: (не проверено)
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' => '[email protected]',
'verified' => true
)
);
});
}
Table::insert()
не является допустимым методом