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