在 Laravel 迁移文件中填充数据库

2022-08-30 06:40:57

我刚刚学习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.example`,
                'verified' => true
            )
        );

    });
}

但是我在运行时收到以下错误:php artisan migrate

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist

这显然是因为 Artisan 尚未创建该表,但所有文档似乎都说有一种方法可以使用 Fluent Query 在迁移过程中填充数据。

有人知道怎么做吗?


答案 1

不要将 DB::insert() 放在 Schema::create() 中,因为 create 方法必须先完成表的制作,然后才能插入内容。请尝试以下操作:

public function up()
{
    // Create the table
    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();
    });

    // Insert some stuff
    DB::table('users')->insert(
        array(
            'email' => 'name@domain.example',
            'verified' => true
        )
    );
}

答案 2

我知道这是一个旧帖子,但由于它出现在谷歌搜索中,我想我会在这里分享一些知识。@erin-geyer指出,混合迁移和播种机可能会带来麻烦,@justamartin,有时您希望/需要将数据作为部署的一部分进行填充。

我会更进一步说,有时希望能够一致地推出数据更改,以便您可以例如部署到过渡,看到一切正常,然后对相同的结果充满信心地部署到生产环境(而不必记住运行一些手动步骤)。

然而,分离出种子和迁移仍然有价值,因为这是两个相关但不同的问题。我们的团队通过创建称为播种者的迁移来妥协。这看起来像这样:

public function up()
{
    Artisan::call( 'db:seed', [
        '--class' => 'SomeSeeder',
        '--force' => true ]
    );
}

这允许您像迁移一样执行种子一次。您还可以实现防止或增强行为的逻辑。例如:

public function up()
{
    if ( SomeModel::count() < 10 )
    {
        Artisan::call( 'db:seed', [
            '--class' => 'SomeSeeder',
            '--force' => true ]
        );
    }
}

这显然会有条件地执行你的播种机,如果少于10个SomeModels。如果要将播种机作为标准播种机包含在调用和迁移时执行的标准播种机,则此方法非常有用,这样您就不会“加倍”。您还可以创建反向播种机,以便回滚按预期工作,例如artisan db:seed

public function down()
{
    Artisan::call( 'db:seed', [
        '--class' => 'ReverseSomeSeeder',
        '--force' => true ]
    );
}

第二个参数是使播种机能够在生产环境中运行所必需的。--force


推荐