如何在没有 Laravel 尝试将其保存到数据库的情况下在 Eloquent 模型中使用受保护的属性
Posted
技术标签:
【中文标题】如何在没有 Laravel 尝试将其保存到数据库的情况下在 Eloquent 模型中使用受保护的属性【英文标题】:How to use a protected property in an Eloquent model without Laravel trying to save it to the database 【发布时间】:2014-09-15 11:22:22 【问题描述】:在我的一个模型中,我有一个名为“slug”的属性。当 slug 改变时,我需要在更新到新的之前记录原始 slug,所以我的模型有一个受保护的属性“originalSlug”。在保存模型之前,我在我的模型中做了这样的事情:
protected $originalSlug;
public function customSave($newSlug)
$this->originalSlug = $this->slug;
$this->slug = $newSlug;
return $this->save();
然后我有一个事件,在成功保存后使用该 originalSlug 执行其他任务。 问题是 Laravel 试图将 originalSlug 保存到数据库中,尽管它实际上不是属性并且没有数据库列。所以它失败并出现“找不到列”错误。
我该怎么做才能让 Laravel 忽略 originalSlug 属性,或者我应该有更好的方法吗?
【问题讨论】:
为什么不在调用 save 之前引发事件? 我只希望在模型成功保存后触发事件。 是的,您可以引发事件,将旧数据作为 DTO 传递。然后仅在模型成功保存后触发它。这个系列可能会有所帮助:laracasts.com/series/commands-and-domain-events 感谢您的信息。我会研究那个系列的。目前我有点想不通,但这很可能是最好的方法。 可能的解决方案:***.com/questions/22297240/… 【参考方案1】:如果您希望Eloquent
忽略某个属性,则需要对其进行设置,否则__set
将被调用,Eloquent
会将其视为属性。
您也可以为此使用mutator
。
这就是你需要的:
public $originalSlug;
public function customSave($newSlug)
$this->originalSlug = $this->slug;
$this->slug = $newSlug;
return $this->save();
或:
protected $originalSlug;
public function customSave($newSlug)
$this->originalSlug = $this->slug;
$this->slug = $newSlug;
return $this->save();
public function setOriginalSlugAttribute($value)
$this->originalSlug = $value;
那么 Eloquent 不会设置 originalSlug attribute
,所以它不会被保存到数据库中。
您可以通过事件来做到这一点,就像 cmets 中建议的那样,我也会建议这种方式。
【讨论】:
以上是关于如何在没有 Laravel 尝试将其保存到数据库的情况下在 Eloquent 模型中使用受保护的属性的主要内容,如果未能解决你的问题,请参考以下文章
laravel应用程序不会保存图像,但会将其文件名存储到数据库中