Laravel 数据填充(Seed)6 个小技巧分享

要点 1. 使用 updateOrCreate() 来避免重复填充

想象一下这个填充代码,想象一下由于一些原因这个填充将被多次启动:

public function run()
{
    $items = [
        ['id' => 1, 'title' => 'Administrator'],
        ['id' => 2, 'title' => 'Simple user'],
    ];

    foreach ($items as $item) {
        Role::create($item);
    }
}

第二次尝试执行填充的时候可能会因为 ID 冲突而失败。在其他情况下,如果你没有指定 ID,然后你可能会在表中填充很多数据,并且是重复输入。为了避免此情况,可以尝试以下方式:

foreach ($items as $item) {
    Role::updateOrCreate(['id' => $item['id']], $item);
}

要点 2. 只运行一个 Seeder 类

前段时间我十分惊讶多少人不知道在执行  php artisan db:seed 命令时可以指定一个填充类。

php artisan db:seed

这个命令会启动在 DatabaseSeeder.php 文件中列出的所有类。

但你可以将启动限制在一个精确的填充类中:

php artisan db:seed --class=UsersTableSeeder

要点 3. 从迁移文件中执行 Seeder 类

通常你需要创建一个新的数据表,并且马上需要填充一些数据。但在生成环节中你不能马上执行 "artisan db:seed",尤其如果你有仅涉及到 "artisan migrate" 命令的自动部署程序。

小手段是从迁移文件中启动特定的填充文件。

public function up()
{
    Schema::create('themes', function (Blueprint $table) {
        $table->increments('id');
        $table->text('name');
    });

    Artisan::call('db:seed', [
        '--class' => ThemesTableSeeder::class
    ]);
}

要点 4. 有关联的 Seeder 工厂类: 使用父级工厂类

如果你正在构建工厂类来做你的数据填充, 你是如何处理两个模型之间的关系的呢? 例如,你需要填充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 的嘛?直接使用另一个工厂。

要点 5. DatabaseSeeder 应对本地和生产环境

有时候你仅在本地环境下需要填充某些数据,生产环境下则并不需要。或者,使用不同的填充文件来填充不同的环境。

我不是很确定这是否是最优雅的处理方式,但这是过去我如何整理本地和生产环境下不同填充类的方法。

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 生成基于 Database 的填充类

最后一个要点可以说是一个我自己使用过不少时间的工具,叫 iSeed Generator

安装完成后,你可以运行下面的命令:

$ php artisan iseed users --force

这会在你的 seeds 目录下生成 UsersTableSeeder.php 文件, --force 选项是用来强制覆盖任何已经存在的填充类。

要点 7. 在生产环境中运行数据填充

要点都在这儿了,最后说一个在构建填充类时的小常识,在你的 local/staging 本地环境中你可以反复运行 "artisan migrate:fresh --seed" 无任何风险,这不会丢失任何重要的数据,但在 production 生产环境中你只能运行 "artisan db:seed" 一次 ,然后彻底忘掉这个操作。如果你要在生产环境填充额外的数据,那就把它放到迁移文件中,详见要点 3。


Practice makes perfect.

原文地址:https://laraveldaily.com/10-tips-about-d...

译文地址:https://learnku.com/laravel/t/26049

本帖已被设为精华帖!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会