Laravel关联删除语句异常求助:无报错但未执行预期操作
解决Laravel中Left Join后删除NULL关联记录无效果的问题
这问题我之前排查过好几次,核心原因是Laravel Query Builder的where方法在处理IS NULL这种特殊条件时,逻辑和你想的不一样,导致你的语句实际上没生成正确的SQL。
问题根源
当你写where("hotel_device.device_id","IS","NULL")时,Laravel的Query Builder并不会把它解析成你期望的WHERE hotel_device.device_id IS NULL,而是会把第三个参数NULL当成字符串处理,最终生成的SQL类似:
WHERE hotel_device.device_id = 'NULL'
这显然匹配不到任何行,自然也就不会执行删除操作。而你直接在数据库跑原生SQL时,IS NULL是SQL的语法关键字,能正确识别NULL值,所以可以正常工作。
正确的解决方案
这里给你两种靠谱的写法:
1. 使用Laravel内置的whereNull方法(推荐)
Laravel专门为判断NULL值提供了便捷方法,代码更简洁也不易出错:
DB::table('devices') ->leftJoin('hotel_device', 'hotel_device.device_id', '=', 'devices.id') ->whereNull('hotel_device.device_id') ->delete();
2. 使用whereRaw执行原生条件
如果一定要用IS NULL的原生写法,可以直接用whereRaw来绕过Query Builder的参数解析:
DB::table('devices') ->leftJoin('hotel_device', 'hotel_device.device_id', '=', 'devices.id') ->whereRaw('hotel_device.device_id IS NULL') ->delete();
额外提醒
以后碰到NULL值判断的场景,优先用whereNull或whereNotNull,这是Laravel官方推荐的方式,既符合框架规范,也能避免类似的坑。
内容的提问来源于stack exchange,提问作者Delmontee
相关产品推荐
相关产品推荐

