如何在雄辩的模型中使用受保护的属性,而不让Laravel尝试将其保存到数据库中
在我的一个模型中,我有一个名为“slug”的属性。当slug被更改时,我需要在更新到新slug之前记录原始slug,因此我的模型有一个受保护的属性“originalSlug”。在保存模型之前,我在模型中执行以下操作:如何在雄辩的模型中使用受保护的属性,而不让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;
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;
}