Я только изучаю 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 для заполнения данных как части миграции.
Кто-нибудь знает как? Спасибо!
php
laravel
migration
mysql-error-1146
Адам Хопкинсон
источник
источник
DB::table('users')->insert([ ['email' => 'taylor@example.com', 'votes' => 0], ['email' => 'dayle@example.com', 'votes' => 0] ]);
Я знаю, что это старый пост, но, поскольку он появляется в поиске Google, я подумал, что поделюсь некоторыми знаниями здесь. @ erin-geyer указал, что смешивание миграций и сидеров может создать головную боль, а @justamartin возразил, что иногда вам нужно / нужно, чтобы данные были заполнены как часть вашего развертывания.
Я бы пошел еще дальше и сказал, что иногда желательно иметь возможность последовательно развертывать изменения данных, чтобы вы могли, например, развернуть на промежуточной стадии, убедиться, что все в порядке, а затем развернуть в производственной среде с уверенностью в тех же результатах. (и не нужно помнить, что нужно выполнить какой-то шаг вручную).
Тем не менее, разделение семени и миграции по-прежнему имеет значение, поскольку это две взаимосвязанные, но разные проблемы. Наша команда пошла на компромисс, создав миграции, которые вызывают сидеры. Это выглядит так:
Это позволяет вам выполнить семя один раз, как миграцию. Вы также можете реализовать логику, предотвращающую или улучшающую поведение. Например:
Это, очевидно, приведет к условному выполнению вашего сидера, если имеется менее 10 SomeModels. Это полезно, если вы хотите включить сидер в качестве стандартного сидера, который запускается как при вызове,
artisan db:seed
так и при миграции, чтобы вы не «удваивались». Вы также можете создать обратную сеялку, чтобы откаты работали должным образом, напримерВторой параметр
--force
необходим, чтобы сеялка могла работать в производственной среде.источник
Вот очень хорошее объяснение того, почему использование Laravel Database Seeder предпочтительнее использования Migrations: http://laravelbook.com/laravel-database-seeding/
Хотя, следование инструкциям в официальной документации - гораздо лучшая идея, потому что реализация, описанная по приведенной выше ссылке, кажется, не работает и является неполной. http://laravel.com/docs/migrations#database-seeding
источник
Это должно делать то, что вы хотите.
источник
Еще один простой способ сделать это - определить частный метод, который создает экземпляр и сохраняет соответствующую модель.
С помощью этого решения Eloquent будет генерировать поля временных меток.
РЕДАКТИРОВАТЬ: лучше использовать систему сидера, чтобы различать создание структуры базы данных и заполнение базы данных.
источник
$model = new App\UserRoles();
, но в остальном ... отлично!Я попробовал этот метод вставки в БД, но, поскольку он не использует модель, он проигнорировал вялую черту, которая была у меня на модели. Итак, учитывая, что модель для этой таблицы существует, я решил, что после ее переноса модель будет доступна для вставки данных. И я придумал это:
Это сработало правильно, а также приняло во внимание свойство sluggable в моей модели для автоматического создания слага для этой записи и также использует временные метки. NB. Добавление идентификатора не было обязательным, однако в этом примере мне нужны были конкретные идентификаторы для моих категорий. Протестировано на Laravel 5.8.
источник
Если вы уже заполнили столбцы и добавили новые или хотите заполнить старый столбец новыми фиктивными значениями, сделайте следующее:
источник