Laravel 5.5删除通知SQL语法错误求助:data->video_id用法问题
解决Laravel 5.5中删除JSON字段匹配的通知时的SQL语法错误
你遇到的问题根源在于MariaDB对JSON字段的查询语法和你写的data->video_id不兼容,咱们来一步步搞定它:
为什么会报错?
你用的data->video_id是MySQL的JSON字段简写语法,但和Laravel 5.5同期的MariaDB版本并不支持这种写法,直接写会触发语法错误,也就是你看到的near '>video_id=89'的问题。另外,直接把$video_id拼进SQL语句还存在SQL注入风险,这也是必须避免的。
解决方案
方案1:用Laravel原生的JSON字段查询(推荐)
Laravel 5.5的查询构造器已经原生支持JSON字段查询,它会根据你使用的数据库类型自动生成正确的SQL语法,完全不用自己写Raw语句:
DB::table('notifications') ->where('data->video_id', $video_id) ->delete();
这种写法既简洁又安全,Laravel会帮你处理好MariaDB需要的JSON函数语法,同时自动做参数绑定防止注入。
方案2:手动用MariaDB支持的JSON函数写法
如果你一定要用whereRaw,可以用MariaDB支持的JSON_EXTRACT函数,或者正确的箭头路径写法(注意要加$表示根节点):
用JSON_EXTRACT函数
DB::table('notifications') ->whereRaw("JSON_EXTRACT(data, '$.video_id') = ?", [$video_id]) ->delete();
用MariaDB的箭头语法(适合MariaDB 10.2+)
DB::table('notifications') ->whereRaw("data->>'$.video_id' = ?", [$video_id]) ->delete();
这里的->>是用来获取JSON字段的字符串值,$.video_id是标准的JSONPath路径,指向data字段里的video_id键。
额外提醒
不管用哪种写法,都要避免直接把变量拼进SQL语句里,用参数绑定(比如上面的?和[$video_id])才能保证代码的安全性。
内容的提问来源于stack exchange,提问作者creative_mazhar
相关产品推荐
相关产品推荐

