You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:51:20