我在模型中设置了变量$fillable
。我想测试update
功能,我收到此错误:
SQLSTATE [42S22]:未找到列:1054未知列' _方法'在'字段列表' (SQL:更新
positions
设置name
=休闲水生领袖,_method
= PUT,id
= 2,description
=这是我的描述,{{1 }} = 2014-05-29 17:05:11其中updated_at
。positions
= 1而client_id
= 2)"
为什么当我的可填写件没有作为参数时,这会在id
大喊大叫?我的更新功能是:
_method
答案 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