文章转发自专业的Laravel开发者社区,原文链接:https://learnku.com/laravel/t...关键点1.使用updateOrCreate()避免重复填充想象一下这个填充代码,想象一下这个填充会因为某种原因被多次启动:publicfunctionrun(){$items=[['id'=>1,'title'=>'Administrator'],['id'=>2,'title'=>'简单用户'],];foreach($itemsas$item){角色::创建($item);}}执行填充的第二次尝试可能由于ID冲突而失败。在其他情况下,如果不指定ID,则可能会用大量数据和重复条目填充表。为避免这种情况,请尝试以下操作:foreach($itemsas$item){Role::updateOrCreate(['id'=>$item['id']],$item);}点2.只运行一个TheSeederA类前段时间我很惊讶有多少人不知道在执行phpartisandb:seed命令时可以指定播种器类。phpartisandb:seed此命令启动DatabaseSeeder.php文件中列出的所有类。但是你可以将启动限制为一个精确的填充类:phpartisandb:seed--class=UsersTableSeederPoint3.从一个迁移文件中执行Seeder类通常你需要创建一个新的数据表并立即需要填充一些数据。但是你不能在构建过程中立即执行“artisandb:seed”,特别是如果你有只涉及“artisanmigrate”命令的自动部署器。诀窍是从迁移文件中启动一个特定的填充文件。publicfunctionup(){Schema::create('themes',function(Blueprint$table){$table->increments('id');$table->text('name');});Artisan::call('db:seed',['--class'=>ThemesTableSeeder::class]);}要点4.有一个关联的Seeder工厂类:如果你正在构建工厂类,请使用父工厂类做你的数据Fill,你怎么处理两个模型之间的关系?例如,您需要填充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,];});你有没有发现它是如何填充company_id的?直接用别的工厂。Point5.DatabaseSeederforlocalandproductionenvironments有时你只需要在本地环境中填充一些数据,而不是在生产环境中。或者,使用不同的shim文件来填充不同的环境。我不太确定这是否是最优雅的方式,但这是我过去在本地和生产中整理不同polyfill类的方式。classDatabaseSeederextendsSeeder{/***为应用程序的数据库播种。**@returnvoid*/publicfunctionrun(){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);}}}Point6.使用iSeed生成Database-basedfillerclass最后一点可以说是我用了很久的工具了。它被称为iSeed生成器。安装完成后,您可以运行以下命令:$phpartisanisedusers--force这将在您的种子目录中生成一个UsersTableSeeder.php文件,--force选项用于强制覆盖任何现有的填充类。重点七、生产环境运行数据填报重点都在这里。最后,建立填充类时的一些常识。您可以在本地/暂存本地环境中重复运行“artisanmigrate:fresh--seed”没有风险,您不会丢失任何重要数据,但在生产环境中您只能运行“artisandb:seed”一次并忘记它.如果要在生产中填充其他数据,请将其放入迁移文件中,有关详细信息,请参见第3点。
