如何在没有 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中的控制器将数据保存在数据库中

如何返回并显示保存到数据库laravel的json数据

Laravel如何将HTML保存到数据库然后检索它

laravel应用程序不会保存图像,但会将其文件名存储到数据库中

Laravel - 从 JSON 数组创建对象以将其保存在 SQL 数据库中

我无法将输入保存到数据库 Vuejs 和 Laravel