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
相关产品推荐
相关产品推荐

