laravel меток пользователей без нарушения заполнения базы данных - PullRequest
0 голосов
/ 07 февраля 2020

Можно ли как-нибудь автоматизировать заполнение колонки 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

, потому что " Создается «событие» и действует наблюдатель. Есть ли хоть какой-нибудь способ помешать наблюдателю принять меры?

Любая помощь будет приветствоваться. Спасибо:)

1 Ответ

1 голос
/ 07 февраля 2020

В сеялке установите и отмените значение конфигурации до и после заводской настройки.

// 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());
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...