【发布时间】:2019-12-16 01:32:06
【问题描述】:
我在更新 Laravel 中的记录时遇到了一些奇怪的问题。我使用此代码更新记录:
$student = new Student();
$student->exists = true;
$student->reg_number = $request->post('reg_number');
$student->name = $request->post('name');
$student->level_id = $request->post('level_id');
$student->status = $request->post('status');
$student->save();
代码第一次执行良好。但是,当我再次尝试更新同一条记录时,我得到了错误
SQLSTATE[23000]:违反完整性约束:1062 重复条目 键“PRIMARY”的“F17/2019/2019”(SQL:插入
students(reg_number、name、level_id、updated_at、created_at)值 (F17/2019/2019, 约翰·杜斯, 5, 2019-08-08 10:31:52, 2019-08-08 10:31:52))。
但是,过了一段时间,比如半小时左右,我可以再次更新记录而不会出现错误,但只能更新一次。第二次尝试会恢复错误。
我尝试了this question 中讨论的各种其他技术,但结果是相同的。该错误表明 Laravel 选择使用 INSERT 而不是 UPDATE SQL 语句,而记录存在并且我已明确指定它应该更新现有记录。
有人知道这里发生了什么吗?
我使用 MySQL,我的学生表 PRIMARY KEY 是 VARCHAR 类型的 reg_number。学生控制器如下所示:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
protected $fillable = [
'reg_number',
'name',
'level_id',
'status'
];
protected $primaryKey = 'reg_number';
public $incrementing = false;
}
【问题讨论】:
-
请不要使用 new Student();对于现有记录,使用 Student::find()
-
当您设置
exists时,代码会更新现有记录。请按照我的问题中的链接。此外,记录第一次更新的事实应该提示您错误不是由使用new Student()引起的。 -
该链接有超过 3 年前的答案,如果你挖掘源代码,我不会太相信存在的属性,还有像
$wasRecentlyCreated这样的其他属性。获取现有模型的推荐方法是从数据库中对它们进行水合。 -
@dparoli
exists属性实际上在 Laravel 5.8 中有效。试试看。 -
在你的情况下它不起作用,你的问题就是这个。我不明白你为什么不想在数据库中找到模型,我错过了什么吗?