【问题标题】:Column not found: Unknown column using Model reference but work with object reference laravel 6未找到列:使用模型引用但使用对象引用 laravel 6 的未知列
【发布时间】:2020-03-20 05:42:42
【问题描述】:

我正在使用控制器中的验证更新我的用户表。我为同一个控制器中的两个表创建了相同的验证。
当我使用此代码时:
User::where('id',$data->user_id)->update($this->validateField($data->user_id));

它显示

错误:找不到列:1054 未知列 'address_name'

这是正确的,因为用户表没有列“address_name”,但它可以与此代码一起使用而没有任何错误

$user = User::where("id",$data->user_id)->firstOrFail(); $user->update($this->validateField($data->user_id));

这两个代码有什么不同,为什么它不起作用(显示未知列错误)以及为什么它在没有列错误的情况下起作用?

这是我的 validateField 方法

public function validateField($id)
{
  return request()->validate([
        'address_name' => 'required|string|max:255',
        'mobile' => 'required|numeric|digits_between:10,13',
        'land_line' => 'required|numeric|digits_between:10,13',
        'min_order' => 'required',
        'payment_method' => 'required',
        'open_time' => 'required',
        'close_time' => 'required',
        'address'=>'required|string|max:255',
        'city'=>'required|string|max:255',
        'country'=>'required|string|max:255',
        'is_active' => 'required',
        'first_name' => 'required|string|max:255',
        'last_name' => 'required|string|max:255',
        'email' => 'required|email|max:255|unique:users,email,'.$id.',id,deleted,0',
        'password' => 'sometimes|required|min:8',

     ]);
}

我的用户表

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('first_name');
        $table->string('last_name');
        $table->string('email');
        $table->string('password');
        $table->string('mobile');
        $table->tinyInteger('user_role')->unsigned();
        $table->tinyInteger('is_active')->unsigned()->default(1);
        $table->datetime('last_login')->nullable();
        $table->tinyInteger('deleted')->unsigned()->default(0);
        $table->dateTime('created_at')->nullable();
        $table->dateTime('updated_at')->nullable();
        $table->integer('updated_by')->nullable();
        $table->rememberToken();

    });

【问题讨论】:

  • 确定 firstOrFail 没有失败?
  • 是的,它没有失败。只是想知道区别。很好解释。谢谢

标签: php mysql model laravel-validation laravel-6


【解决方案1】:

User::where('id',$data->user_id)->update($this->validateField($data->user_id));

这将更新与where 对应的所有记录,并将字段作为参数传递给update 函数,这只是where 将只有一个匹配项的情况(因为您正在应用 where主键的子句),如果有多个匹配项,则更新所有记录。
请记住,where 函数将返回一个Builder,因此update 函数是类updateupdate:这意味着只有一个查询(update ... set ... where id = /*your id*/)。

改为这个

User::where("id",$data->user_id)->firstOrFail()->update($this->validateField($data->user_id))

将首先获得与where子句匹配的第一个记录,因此会有一个类似select .. from .. where id= /*your id*/的查询,而不是Model将被称为update函数,所以这里调用的函数id为Model -> update 函数,之前是 Builder -> update,因此会有第二个查询更新。

不同的行为是由两个类中update函数的不同实现引起的。实际上,在我的服务器上,如果传递给update 的数组中的某些字段不是表字段,这两种方法都会抛出错误,不知道为什么你的第一个可以正常工作

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多