如何在雄辩的模型中使用受保护的属性,而不让Laravel尝试将其保存到数据库中

如何在雄辩的模型中使用受保护的属性,而不让Laravel尝试将其保存到数据库中,laravel,properties,model,attributes,eloquent,Laravel,Properties,Model,Attributes,Eloquent,在我的一个模型中,我有一个名为“slug”的属性。当slug被更改时,我需要在更新到新slug之前记录原始slug,因此我的模型有一个受保护的属性“originalSlug”。在保存模型之前,我在模型中执行以下操作: protected $originalSlug; public function customSave($newSlug){ $this->originalSlug = $this->slug; $this->slug = $newSlug;

在我的一个模型中,我有一个名为“slug”的属性。当slug被更改时,我需要在更新到新slug之前记录原始slug,因此我的模型有一个受保护的属性“originalSlug”。在保存模型之前,我在模型中执行以下操作:

protected $originalSlug;

public function customSave($newSlug){
   $this->originalSlug = $this->slug;
   $this->slug = $newSlug;
   return $this->save();
}
然后,我有一个事件,在成功保存后,它使用该originalSlug执行其他任务。 问题是,Laravel试图将originalSlug保存到数据库中,尽管它实际上不是属性,也没有数据库列。所以它失败了,出现了“Column not found”错误

我该怎么做才能让Laravel忽略originalSlug属性,或者有更好的方法吗

  • 如果希望
    Eloquent
    忽略某个属性,则需要将其设置为可访问的属性,否则将调用
    \u set
    ,并且
    Eloquent
    将其视为属性

  • 您也可以为此使用
    mutator

  • 因此,以下是您需要的:

    public $originalSlug;
    
    public function customSave($newSlug){
       $this->originalSlug = $this->slug;
       $this->slug = $newSlug;
       return $this->save();
    }
    
    或:

    然后,Eloquent不会设置originalSlug
    属性,因此它不会保存到数据库中


    您可以使用评论中建议的事件执行此操作,我也建议这样做。

    为什么不在调用save之前引发事件?我只希望在成功保存模型的情况下引发事件。是的,您可以引发事件,将旧数据作为DTO传递。然后,只有在模型成功保存后才触发它。本系列可能会有所帮助:谢谢你提供的信息。我会调查那个系列。目前这有点让我不知所措,但这很可能是最好的方法。可能的解决方案:
    protected $originalSlug;
    
    public function customSave($newSlug){
       $this->originalSlug = $this->slug;
       $this->slug = $newSlug;
       return $this->save();
    }
    
    public function setOriginalSlugAttribute($value)
    {
       $this->originalSlug = $value;
    }