Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t…
Пункт 1. Используйте updateorcreate (), чтобы избежать двойного заполнения
Представьте себе этот код заполнения, представьте, что по какой-то причине это заполнение будет запускаться несколько раз:
public function run()
{
$items = [
['id' => 1, 'title' => 'Administrator'],
['id' => 2, 'title' => 'Simple user'],
];
foreach ($items as $item) {
Role::create($item);
}
}Вторая попытка выполнить заполнение может завершиться неудачей из-за конфликта идентификаторов. В других случаях, если вы не укажете идентификатор, вы можете заполнить много данных в таблице и повторить ввод. Чтобы избежать этого, попробуйте следующее:
foreach ($items as $item) {
Role::updateOrCreate(['id' => $item['id']], $item);
}Пункт 2. Запускайте только один класс сеялки
Некоторое время назад я был удивлен, как много людей не знали, что их казнят php artisan db:seed Команда для указания класса заполнения.
php artisan db:seed
Эта команда начнется с DatabaseSeeder.php Все классы, перечисленные в файле.
Но вы можете ограничить запуск точным классом наполнителя:
php artisan db:seed --class=UsersTableSeeder
Пункт 3. Выполните начальный класс из файла миграции
Обычно вам нужно создать новую таблицу данных и немедленно заполнить некоторые данные. Но вы не можете сразу выполнить “база данных artisan: начальное значение” на этапе создания, особенно если у вас есть программа автоматического развертывания, которая включает только команду “перенос ремесленника”.
Хитрость заключается в том, чтобы запустить конкретный файл народонаселения из файла миграции.
public function up()
{
Schema::create('themes', function (Blueprint $table) {
$table->increments('id');
$table->text('name');
});
Artisan::call('db:seed', [
'--class' => ThemesTableSeeder::class
]);
}
Пункт 4. Связанный заводской класс сеялки: используйте родительский заводской класс
Если вы создаете заводские классы для заполнения данных, как вы справляетесь с отношениями между двумя моделями? Например, нужно ли вам заполнить 10 компаний и 10 контактных данных этих компаний?
Ваш database/factories/CompanyFactory.php Все будет так:
$factory->define(App\Contact::class, function (Faker\Generator $faker) {
return [
'company_id' => factory('App\Company')->create()->id,
'first_name' => $faker->firstName(),
'last_name' => $faker->lastName,
'phone1' => $faker->phoneNumber,
'phone2' => $faker->phoneNumber,
'email' => $faker->email,
'skype' => $faker->word,
'address' => $faker->address,
];
});Ты узнал, каково это? идентификатор компании Ну и что? Используйте другую фабрику напрямую.
Пункт 5. База данных для локальной и производственной среды
Иногда вам нужно только заполнить некоторые данные в локальной среде, но не в производственной среде. Или используйте разные файлы заполнения для заполнения разных сред.
Я не уверен, что это самый элегантный способ справиться с этим, но именно так я обычно организовывал различные классы наполнителей в своей локальной и производственной среде.
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
if (app()->environment() == 'production') {
$this->call(ThemesTableSeeder::class);
$this->call(LanguagesTableSeeder::class);
} else {
$this->call(UsersTableSeeder::class);
$this->call(ModulesTableSeeder::class);
$this->call(ThemesTableSeeder::class);
$this->call(LanguagesTableSeeder::class);
}
}
}
Пункт 6. Используйте начальное значение для создания класса населения на основе базы данных
Последним пунктом можно назвать инструмент, которым я пользовался много времени, называемый генератором iseed.
После завершения установки вы можете выполнить следующую команду:
$ php artisan iseed users --force
Это будет в вашем каталоге семена Создать в каталоге UsersTableSeeder.php Документы, --Параметр принудительно используется для принудительной перезаписи любого существующего класса заполнения.
Пункт 7. Запуск заполнения данных в производственной среде
Вот в чем главное. Наконец, давайте поговорим о небольшом здравом смысле при создании класса наполнителя. В вашем локальном/промежуточном Вы можете запустить его несколько раз в локальной среде “миграция ремесленников:свежие семена” Нет риска, что какие-либо существенные данные будут потеряны, но производство Вы можете работать только в производственной среде “база данных artisan:seed” Однажды А потом забудь об этом. Если вы хотите заполнить производственную среду дополнительными данными, поместите их в файл миграции, как описано в пункте 3.