“字段列表”

时间:2017-11-18 16:33:44

标签: laravel laravel-5 eloquent laravel-5.3 csrf

我注意到某些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

上运行的

3 个答案:

答案 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