【问题标题】:laravel userstamps without disturbing the database seedinglaravel 用户戳而不干扰数据库播种
【发布时间】:2020-05-23 03:59:40
【问题描述】:

有没有什么方法可以在不使用观察者的情况下自动填充created_by 列,但保持我的控制器清洁?我不想使用观察者,因为当我尝试播种我的数据库时,会发生错误。

我现在的做法:

class ClientObserver
{
    public function creating(Client $client)
    {
        $client->author()->associate(auth()->user());
    }
}

当我注册到服务提供商的引导时,它适用于通过应用程序创建客户端,但是当我使用 artisan 为该工厂的数据库播种时:

$factory->define(Client::class, function (Faker $faker) {
    return [
        'name' => $faker->company,
        'description' => $faker->paragraph,
        'address' => $faker->address,
        'created_by' => User::all()->random()->id,
    ];
});

我收到此错误:

Integrity constraint violation: 19 NOT NULL constraint failed: clients.created_by

因为“创建”事件被触发并且观察者行动。至少有什么方法可以阻止观察者采取行动?

欢迎任何帮助。谢谢你:)

【问题讨论】:

    标签: php laravel laravel-seeding laravel-events


    【解决方案1】:

    在播种器中,设置和取消设置工厂前后的配置值。

    // DatabaseSeeder.php
    public function run()
    {
        config()->set('seeding', true);
    
        factory(App\Client::class, 50)->create();
    
        config()->set('seeding', false);
    }
    

    您可以通过覆盖模型的引导方法来避免Observer。检查配置值并根据需要设置用户。

    // Client.php
    protected static function boot() {
        parent::boot();
    
        static::creating(function($client) {
            if (config()->get('seeding') === true)
                auth()->setUser(User::inRandomOrder()->first());
            $client->author()->associate(auth()->user());
        });
    }
    

    【讨论】:

    • 成功了,tnks!我唯一要指出的是:User::random() 是未定义的。 User::all()->random()User::inRandomOrder()->first() 成功了(认为最后一个很快,但 idk)。
    • 是的,你是对的。在浏览器中编码的危险......我想我可能引用了一个旧的 Laravel 方法,但你明白了。我用你的建议更新了代码。无论如何很乐意提供帮助!
    猜你喜欢
    • 2015-09-25
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2016-01-20
    • 2019-05-31
    相关资源
    最近更新 更多