为什么Laravel的updateOrCreate()与upsert()需要传入唯一标识记录的参数?
Laravel
updateOrCreate() 与 upsert() 要求传入唯一标识列的原因说明 你的猜测是正确的。这两个方法并不是所有场景下都会生成INSERT INTO ON DUPLICATE KEY语句,甚至updateOrCreate()默认的实现逻辑本来就不会生成这类SQL,二者的运行逻辑有本质区别,所以都要求传入可唯一标识记录的列。
updateOrCreate() 的运行逻辑
- 它采用先查询后操作的两步实现,全程不会用到
INSERT INTO ON DUPLICATE KEY语法:- 第一步:以传入的唯一标识列作为查询条件,检索数据库中是否存在对应记录
- 第二步:如果记录存在就执行
UPDATE更新指定字段,不存在就执行INSERT插入新记录
- 要求传入唯一标识列的原因非常直接:它需要靠这个条件定位到要更新的目标记录,没有这个参数就无法完成前置的查询动作。
upsert() 的运行逻辑
- 它的底层确实会生成数据库原生的upsert语法(MySQL下为
INSERT INTO ON DUPLICATE KEY,PostgreSQL下为ON CONFLICT),但依然需要传入唯一标识列,原因有两个:- 适配多数据库的语法差异:Laravel需要根据你传入的唯一列,拼接对应数据库的冲突判断逻辑,保证跨数据库场景下的语法兼容性
- 明确冲突判断规则:如果你的数据表存在多个唯一索引,传入指定的唯一列可以明确告知框架,只有当对应索引出现冲突时才执行更新,避免其他索引冲突时产生误更新的问题
内容的提问来源于stack exchange,提问作者Qiulang
相关产品推荐
相关产品推荐

