迁移后的 Laravel 种子

Posted

技术标签:

【中文标题】迁移后的 Laravel 种子【英文标题】:Laravel seed after migrating 【发布时间】:2015-04-12 08:50:35 【问题描述】:

迁移完成后,我可以在我的迁移中添加一些东西来自动为表添加测试数据吗?

或者您单独播种吗?

【问题讨论】:

【参考方案1】:

您可以使用--seed 选项调用migrate:refresh 以在迁移完成后自动播种:

php artisan migrate:refresh --seed

这将回滚并重新运行所有迁移,然后运行所有播种机。


除了一点点额外功能,您还可以随时使用 Artisan::call() 从应用程序内部运行工匠命令:

Artisan::call('db:seed');

Artisan::call('db:seed', array('--class' => 'YourSeederClass'));

如果你想要特定的播种机类。

【讨论】:

我按照你说的做了,在生产之前一切正常。生产因此而冻结。详情请看我的question。 请注意,如果在数据库中有种子数据以外的数据之后在生产环境中运行此程序,您将丢失这些数据。【参考方案2】:

虽然lukasgeiter's answer 是正确的,但我想详细说明您的第二个问题。

还是要单独播种?

是的。由于您在谈论测试数据,您应该避免将种子迁移结合起来。当然,如果这不是测试数据,而是应用程序数据,您可以随时将插入数据作为迁移的一部分。

顺便说一句,如果您想将数据作为 testing 的一部分播种,您可以在 Laravel 测试用例中调用 $this->seed()

【讨论】:

【参考方案3】:

如果您不想删除现有数据并希望在迁移后播种

lukasgeiter's answer 对测试数据是正确的,但是按照 artisan 命令运行

php artisan migrate:refresh --seed

在生产中将刷新您的数据库,删除从前端输入或更新的任何数据。

如果您想在迁移过程中为您的数据库播种(例如,对保留现有数据的应用程序进行更新),例如在种子数据中添加新表国家,您可以执行以下操作:

在 database/seeds 和你的位置表迁移中创建一个数据库播种器示例 YourSeeder.php

class YourTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('tablename', function (Blueprint $table) 
            $table->increments('id');
            $table->string('name',1000);
            $table->timestamps();
            $table->softDeletes();
        );

        $seeder = new YourTableSeeder();
        $seeder->run();
    

    /**
    * Reverse the migrations.
    *
    * @return void
    */
    public function down()
    
        Schema::dropIfExists('tablename');
    

如果 YourTableSeeder 类出现 php class not found 错误,请运行 composer dump-autoload

【讨论】:

这应该是 imo 接受的答案。在迁移中,这确实是可读的。此外,如果您从迁移中调用命令,您还需要添加 --force 标志以防止系统在生产服务器中要求确认。 这就是我要找的,具有默认内容的新表,无需更改孔数据库。

以上是关于迁移后的 Laravel 种子的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 迁移外键取决于种子数据

如何使用 laravel 迁移和种子正确处理数据库数据更改

Laravel Dusk:迁移和种子测试数据库一次

播种数据库后的laravel种子回滚

使用现有的迁移表进行 laravel 单元测试

laravel5.4学习--laravel目录结构