#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. это не решило мою проблему. Это не подходящий ответ