JSON 查询, whereJsonContains 未查询出结果

这是 Laravel 的查询

Model::query()->whereJsonContains('attributes->value_id', [1,3])->count()

得到的 sql 语句

select count(*) as aggregate from `goods_skus` where json_contains(`attributes`->'$."value_id"', '[1,3]');

最后查询的结果: 0

mysql 原声的语句

select count(*) as aggregate from `goods_skus` where json_contains(`attributes`->'$[*]."value_id"', '[1,3]');

这个能查询出来结果: 1

这是我数据库存储的 json

[{"name": "name1", "value": "value1", "name_id": 1, "value_id": 1}, {"name": "name2", "value": "value3", "name_id": 2, "value_id": 3}]

我想问一下这两个 sql 语句有什么区别吗?

Laravel version: 5.7.*
Mysql version: 5.7.23

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 5
Epona

试试 whereJsonContains('attributes->value_id', ['1','3'])

5年前 评论

@Epona 好像不行.

不过我换了一种 json 的存储方式

{"1": 1, "2": 3}

然后查询也换了一下

Model::query()->whereJsonContains('attributes->1', 1)->whereJsonContains('attributes->2', 3)->count()

这样就能查询出来结果 :smile:

5年前 评论
Epona

@panliang 这个操作有点骚 :smile:

5年前 评论

换 Model::query()->whereJsonContains('attributes', [1,3])->count() 试试

4年前 评论

我也遇到类似问题了, 貌似只能这样单个查询

select * from `menus` where json_contains(`descendants`, ?) or json_contains(`descendants`, ?)
3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!