Laravel Eloquent 如果在插入期间不在表中,则忽略属性

2022-08-30 17:41:07

我有一个模型Foo,它对应于具有以下列的表。

id
描述
user_id

我正在单独设置Foo模型的属性(没有批量分配)

$foo = new Foo;

$foo->id = 1;
$foo->description = "hello kitty";
$foo->user_id = 55;

//...

$foo被发送到另一个类进行其他处理,但由于该类需要更多信息,因此我想简单地将其添加到$foo模型中。

//...
$foo->bar = $additional_information;

Event::fire(DoStuffWithFoo($foo));

$foo->save();  //error

问题是当我,它抱怨这不是一列。$foo->save()bar

我知道在储蓄之前我可以,但是...unset($foo->bar);

有没有可能告诉Eloquent简单地忽略任何不相关的属性?


答案 1

只需在 foo 类中添加为属性:$bar

class Foo extends Model
{

  public $bar;
  //...

现在你可以使用,Laravel不会尝试存储在数据库中。save()bar


解释:

如果调用模型,则只有数组中的那些属性才会保存到数据库中。如果在类中定义为属性,则永远不会在数组中结束。save()$model->attributes$barFoo$foo->bar ="xyz"$model->attributes

但是,如果您没有为 声明这样的属性,则调用 是因为您尝试在无法访问的属性中保存某些内容Foo__set()

您可以查看 :Laravel\Illuminate\Database\Eloquent\Model.php

/**
     * Dynamically set attributes on the model.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    public function __set($key, $value)
    {
        $this->setAttribute($key, $value);
    }

这基本上调用

$this->attributes[$key] = $value;

从。Laravel\Illuminate\Database\Eloquent\Concerns\HasAttributes.php

现在将最终进入,这就是为什么崩溃与.$foo->bar ="xyz"$foo->attribute['bar']save()..this column does not exists..


答案 2

我知道这个问题很老了,但它在最近的搜索中排名靠前,我试图解决类似的问题,我认为这可能是Laravel访问器/突变体的理想情况。我已经在Laravel 5.6上测试过,但相信它可能早在4.2上就有效。

通过创建赋值函数和访问器而不是公共属性,它将允许将字段添加到可填充以进行批量分配,同时仍将其从内部属性中排除(从而防止其错误地保存到数据库)。我理解原始请求排除了批量分配,但这并不一定排除此答案。我认为一个例子会有所帮助:

class Foo extends Model
{
    //Allow bar in mass assignment
    protected $fillable = [
            "bar"
        ];

    /**
     * Store bar in protected variable instead of attributes
     * Because bar is not set in attributes, Laravel will not try to save it to database
     */
    protected $bar;

    /**
     * Mutator method to set bar's value
     */
    public function setBarAttribute($value)
    {
        $this->bar = $value;
    }

    /**
     * Accessor method to retrieve bar's value
     */ 
    public function getBarAttribute()
    {
        return $this->bar;
    }
}

当使用质量分配创建此模型时,如果质量分配的值中存在突变体(setBarAttribute)方法,则将调用该方法。每当访问柱属性时,将调用相应的 get/set 方法。由于赋值函数未在模型的内部属性变量中设置 bar 的值,因此模型不会将 bar 保存到数据库中。


推荐