【问题标题】:How to use a protected property in an Eloquent model without Laravel trying to save it to the database如何在没有 Laravel 尝试将其保存到数据库的情况下在 Eloquent 模型中使用受保护的属性
【发布时间】: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
  • 感谢您的信息。我会研究那个系列的。目前我有点想不通,但这很可能是最好的方法。

标签: laravel properties model attributes eloquent


【解决方案1】:
  1. 如果您希望Eloquent 忽略某个属性,则需要对其进行设置,否则__set 将被调用,Eloquent 会将其视为属性。

  2. 您也可以为此使用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 中建议的那样,我也会建议这种方式。

【讨论】:

    猜你喜欢
    • 2014-11-04
    • 2014-10-15
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多