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

13 浏览
0 Comments

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

我正在学习 Laravel,已经有一个工作的迁移文件创建了一个 users 表。我试图在迁移中自动填充一个用户记录:

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 在迁移的一部分中填充数据的方法。

有人知道怎么做吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

我知道这篇文章比较老,但是因为它在谷歌搜索中出现过,所以我想在这里分享一些知识。@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 ]
        );
    }
}

如果SomeModels少于10个,则显然有条件地执行种子。这在您想要将种子作为标准种子包含在artisan db:seed调用时以及在迁移时执行时非常有用,以便您不会“重复”。您还可以创建反向种子以便回滚,例如:

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

第二个参数--force在生产环境中运行种子是必需的。

0
0 Comments

不要把DB::insert()放在Schema::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
        )
    );
}

0