我注意到某些Laravel
个应用程序出现了奇怪的行为。
当我跑步时,让我们说
Users::where("id",$request->input("id"))->update($request->input());
有时它会很好。在其他情况下,我得到
Unknown column '_token' in 'field list'
因此,有时它只会读取$fillable
参数中设置的内容,有时它会从$request->input()
中读取所有内容。我一直在比较不同的模型,看不出差异。我知道我可以使用$request->only([])
方法来解决这个问题,但其他人是否有这个问题并且可能知道背后的原因?
修改
这是我的model.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class BookingRequests extends Model
{
//
protected $fillable = array(
"account_id",
"quote_id",
"booking_id",
"website_id",
"color",
"custom_group_name",
"is_confirmed",
"ready_to_issue",
"created_by",
);
/**
* Return Quote
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function Quote(){
return $this->belongsTo('App\Quotes',"quote_id","id");
}
}
这是我的控制器
/**
* Update Booking Reques
* @param Request $request
*/
public function update(Request $request){
/**
* Validate
*/
$this->validate($request,array(
"id" => "required"
));
/**
* Update
*/
BookingRequests::where("id",$request->input("id"))->update($request->input());
/**
* Return
*/
return redirect()->back()->with("success","Booking updated");
}
这是在Laravel 5.3.31
答案 0 :(得分:4)
说实话,你现在正在做的事情真的很危险。实际上,无论$fillable
属性如何,现在都可以更新任何字段。这是因为您现在更新如下:
Users::where("id",$request->input("id"))->update($request->input());
当您正在进行这样的更新时,您实际上是直接在数据库中进行更新,并且不使用Eloquent的内容,因此执行的查询看起来像这样:
UPDATE users SET a=1, b=2 WHERE id = 5
因此,如果有人在此表中发送现有列,则会更新非常危险的列,因为您不希望任何人修改您不想要的列。
但如果你做这样的事情:
$user = Users::where("id",$request->input("id"))->firstOrFail();
$user->update($request->input());
在上面的情况下使用Eloquent(首先你在数据库中找到记录,它是Eloquent模型,然后你尝试更新这个Eloquent模型),所以现在可以只更新$fillable
中的字段(假设你正在使用'fillable-way',但你确实在看你的模型)。所以现在,无论发送请求的是什么,只会更新$fillable
中的字段。
显然上面可以用更短的方式写出来:
$user = Users::findOrFail($request->input("id"));
$user->update($request->all());
甚至像这样:
Users::findOrFail($request->input("id"))->update($request->all());
答案 1 :(得分:1)
您可以使用$request->except('_token');
顺便说一句,检查两次,预计会有所请求的所有数据。
答案 2 :(得分:0)
不是sometimes this error happens
,$fillable
仅适用于未在更新中进行创建/插入的批量分配,因此在您更新时包含列_token
。