Laravel Eloquent - $ fillable不起作用?

时间:2014-05-30 00:08:49

标签: laravel eloquent

我在模型中设置了变量$fillable。我想测试update功能,我收到此错误:

  

SQLSTATE [42S22]:未找到列:1054未知列' _方法'在'字段列表' (SQL:更新positions设置name =休闲水生领袖,_method = PUT,id = 2,description =这是我的描述,{{1 }} = 2014-05-29 17:05:11其中updated_atpositions = 1而client_id = 2)"

为什么当我的可填写件没有作为参数时,这会在id大喊大叫?我的更新功能是:

_method

4 个答案:

答案 0 :(得分:6)

更改以下内容:

->update(Input::all());

到此(从数组中排除_method

->update(Input::except('_method'));

更新

实际上正在从update类调用以下Illuminate\Database\Eloquent\Builder方法,该方法由_call类的Illuminate\Database\Eloquent\Relations方法触发(因为您正在调用update关系)并因此$fillable检查未执行,您可以在我回答时使用Input::except('_method')

public function update(array $values)
{
    return $this->query->update($this->addUpdatedAtColumn($values));
}

如果你直接在模型上调用它(不在关系上):

Positions::find($id)->update(Input::all());

然后这不会发生,因为fillable检查将在Model.php内执行,因为update方法将从Illuminate\Database\Eloquent\Model类调用:

public function update(array $attributes = array())
{
    if ( ! $this->exists)
    {
        return $this->newQuery()->update($attributes);
    }

    return $this->fill($attributes)->save();
}

答案 1 :(得分:0)

写一个父类

class BaseModel extends Model

public static function getFillableAttribute(Model $model, $data){
    $array = $model->getFillable();
    $arr = [];
    foreach ($array as $item){
        if( isset($data["$item"])){
            $arr["$item"] = $data["$item"];
        }
    }
    return $arr;
}

答案 2 :(得分:0)

从Laravel 5.2升级到5.4后,我遇到了这一突破-在涵盖该文档的文档/迁移指南中找不到任何内容。

如本github issue所述,对Eloquent的正确修复/使用似乎是:

Positions::find($id)->fill(Input::all())->save();

要触发laravel的fillable检查,然后保留更改。

答案 3 :(得分:0)

您也可以这样做

$data = request()->all();
//remove them from the array
unset($data['_token'],$data['_method']);
//then
Client::find($client_id)
        ->positions()
        ->whereId($id)
        ->update($data);

这将从阵列中删除_method_token