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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 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年前 评论

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