не имеет ошибки значения по умолчанию с установленным мутатором, и наблюдатель обновления не работает

#php #laravel #eloquent #mutators

#php #laravel #красноречивый #мутаторы

Вопрос:

При сохранении модели у меня возникает ошибка, связанная с тем, что атрибут slug не имеет значения по умолчанию. Я создал setSlugAttribute mutators, но он снова выдал мне ошибку.

 //Controller save method inside 
* * *
Task::create($request->all());
* * *

//Task model
public function setSlugAttribute(){
    $this->attributes['slug'] = Str::slug($this->title, '-');
}
  

Как я могу это исправить? Это исправляется с помощью наблюдения (сохранения), не так ли? Еще одна идея?

Я создал TaskObserver и установил его в ServiceProvider.

В наблюдателе методы updated(Task $ task) и updating (Task $ task) не работали!Но созданный метод работает.

 //Update method inside:
$array = $request->all(['title', 'description', 'deadline', 'budget','guest_token']);
$task = Task::where('id',$request->id)->update($array);
//I am waiting working of udate observer but it don't

//TaskObserver
public function updating(Task $task)
{
    dd("updating");
}
public function updated(Task $task)
{
    dd("updated");
}
  

Комментарии:

1. Можете ли вы также поделиться фрагментом кода, который генерирует ошибку, и фактической ошибкой?

2. @CanVural ты можешь это контролировать сейчас?

3. вы вызываете update конструктор, а не саму модель, вы выполняете прямой UPDATE запрос к базе данных, он не включает модель, поэтому событий нет

Ответ №1:

Я решил эту проблему, выполнив следующее:

 //when I assigned it to a variable and then calling update method, it worked
$task = Task::where('id',$request->id)->first();
$update = $task->update($request->all(['title', 'description', 'deadline', 'budget','guest_token']));
  

Ответ №2:

Поэтому каждый раз, когда a Task создается или обновляется, вы хотите slug , чтобы столбец автоматически заполнялся из title столбца.

Средства доступа для этого не подходят. Что вам нужно, так это наблюдатели. Для наблюдателей у вас есть два варианта: на основе закрытия или на основе класса. Учитывая, что ваш вариант использования не слишком сложный, я бы выбрал наблюдателей на основе закрытия.

Вам нужно два события creating и saving обрабатывать их при первом создании модели и при обновлении модели. Итак, ваша модель задачи должна выглядеть следующим образом:

 <?php

class Task extends Model
{
    protected static function creating()
    {
        static::creating(function ($task) {
            $task->slug = Str::slug($task->title, '-');
        });

        static::saving(function ($task) {
            $task->slug = Str::slug($task->title, '-');
        });
    }
}
  

Это должно сработать.

Комментарии:

1. это не решило мою проблему. Это не подходящий ответ