【问题标题】:Laravel Unknown column '_token' in 'field list'“字段列表”中的 Laravel 未知列“_token”
【发布时间】:2018-05-02 06:39:21
【问题描述】:

我注意到一些 Laravel 应用程序出现了奇怪的行为。

当我跑步时让我们说

Users::where("id",$request->input("id"))->update($request->input());

有时它会很好。在其他情况下,我得到 ​​p>

 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 上运行的

【问题讨论】:

  • 你如何调试这个?至少记录请求数据,这样你就知道你从那里得到了什么。可能有成千上万的 laravel 使用 Model-&gt;update 部署,如果您是第一个发现导致您所描述的错误的错误,我会真的感到惊讶。更有可能你用错了。请告诉我们一种重现此问题的方法并告诉我们您是如何调试的。

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


【解决方案1】:

说实话,你现在做的事情真的很冒险。事实上,无论$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());

【讨论】:

  • 感谢您的澄清。
【解决方案2】:

您可以使用$request-&gt;except('_token'); 顺便说一句,检查两次,所有可能通过请求获得的数据都是预期的。

【讨论】:

  • 谢谢,我知道这一点,但我想知道为什么有时会发生此错误而有时不会发生
【解决方案3】:

它不适用于sometimes this error happens$fillable 仅适用于创建/插入未更新的批量分配,因此当您更新它时包含列 _token

【讨论】:

  • fillable 也与update 相关(更新为fillsave),但在现有模型实例而非构建器上调用时。
猜你喜欢
  • 2017-08-09
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多