You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel5.4+PHP5.6使用updateOrCreate更新密码重置令牌报错求助

解决Laravel 5.4中updateOrCreate更新密码重置令牌时的QueryException问题

这个问题我之前也碰到过,原因其实很简单——Laravel的updateOrCreate方法默认会依赖模型的主键来定位要更新的记录,但你的PasswordReset模型没正确适配password_resets表的结构~

问题根源

Laravel默认的password_resets表是没有id自增主键的,它的唯一标识字段是email。但你的PasswordReset模型继承自Model后,默认会把id当作主键。当执行更新操作时,updateOrCreate会尝试用id字段去匹配记录,可表中根本没有这个字段,就会抛出Column not found: 1054 Unknown column 'id' in 'where clause'的异常。而首次创建时不需要定位现有记录,所以能正常执行。

解决方案

只需要修改PasswordReset模型,指定正确的主键并关闭自增设置即可:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class PasswordReset extends Model
{
    // 指定对应的数据表(如果你的表名不是默认的可以调整,这里默认是password_resets)
    protected $table = 'password_resets';
    
    // 将主键设置为email,因为这个表用email作为唯一标识
    protected $primaryKey = 'email';
    
    // 关闭自增,因为email不是自增字段
    public $incrementing = false;
    
    // 允许批量赋值的字段,确保email和token能被正确写入
    protected $fillable = ['email', 'token'];
}

修改完模型后,再执行你的updateOrCreate代码就可以正常更新记录了:

$passwordReset = (new PasswordReset)->updateOrCreate(
    ['email' => $user->email],
    ['token' => str_random(60)]
);

(其实第二个数组里的email可以省略,因为查询条件已经指定了,模型会自动复用)

内容的提问来源于stack exchange,提问作者Yousef Altaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:01:45