Laravel的Eloquent ORM firstOrNew方法批量赋值异常

3

我试图根据2个字段在我的数据库中查找一个模型,如果不存在,就创建一个包含这两个值的新模型。我尝试使用firstOrNew方法来实现此目标:

$store = Store::firstOrNew(array('ext_hash' => $ext_hash, 'ext_type_id' => EXT_TYPE_ID));

然而,这段代码会抛出一个 MassAssignmentException 异常。
避免这个异常的唯一方法是在类级别上分配 fillable 属性吗?根据文档,我应该能够在实例级别上分配 fillable 属性,而不是整个类,但是我应该怎么做呢?
这是 Store 模型的代码:
<?php

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Store extends Eloquent{

        use SoftDeletingTrait;

        public function products(){
                return $this->hasMany('Product');
        }

        public function faqs(){
                return $this->hasMany('ProductFaq');
        }

        public function customer_questions(){
                return $this->hasMany('CustomerQuestion');
        }

        public function users(){
                return $this->hasMany('User');
        }

}

请在你的问题中添加“Store”模型的代码。 - user1922137
我已按要求添加了代码。 - flyingL123
1个回答

3

fillable() 是您需要的方法:

$search = array('ext_hash' => $ext_hash, 'ext_type_id' => EXT_TYPE_ID);

$store = (Store::where($search)->first())
  ?: with(new Store)->fillable(array_keys($search))->fill($search);

或者:

$store = new Store;

$store = ($store->where($search)->first()) ?: $store->fillable(array_keys($search))->fill($search);

fillable 函数只会使得这个操作中的属性可填充,对吗? - geckob
准确来说:对于实例“$store”,以及对其进行的任何后续操作。 - Jarek Tkaczyk
所以,经过这个操作,我们用这个方法设置的 Store 中的 fillable 属性将不需要再次调用此方法就可以填充。 - geckob
1
fillable 是实例属性,不是静态的。因此它仅适用于您设置的实例。它不会影响 Store 模型的其他/新实例。 - Jarek Tkaczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接