laravel 用户戳而不影响数据库播种

laravel userstamps without disturbing the database seeding

有没有什么方法可以在不使用观察器的情况下自动填充 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

因为"creating"事件触发,观察者动作。至少有一些方法可以阻止观察者采取行动吗?

欢迎任何帮助。谢谢:)

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

// 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());
    });
}