set mutator没有默认值错误,并且更新观察器不起作用

时间:2020-09-26 10:45:27

标签: php laravel eloquent mutators

在保存模型时,出现错误,即slug属性没有默认值。 我创建了一个setSlugAttribute变异器,但它再次给了我错误。

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

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

我该如何解决?它确实通过使用watch(saving)进行修复,不是吗?另一个主意吗?

我已经创建了TaskObserver,并在ServiceProvider中设置了它。

在观察器中,updated(Task $ task)和updated(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");
}

2 个答案:

答案 0 :(得分: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']));

答案 1 :(得分:-1)

因此,每次创建或更新Task时,您都希望从slug列中自动填充title列。

访问器对此不利。您想要的是观察员。对于观察者,您有两种选择:基于闭包或基于类。考虑到您的用例不太复杂,我选择基于闭包的观察器。

在首次创建模型和更新模型时,需要两个事件creatingsaving来处理它。因此,您的任务模型应如下所示:

<?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, '-');
        });
    }
}

这应该可以解决问题。