Vic*_*UTT 5 php mysql sql json laravel
我正在尝试查询包含值数组的JSON字段.例如,我们将表格命名为" 用户 "和" 朋友 " 字段.以下是Friends字段的外观:
[{
"id": 1,
"img": "img-1.jpg",
"name": "Name 1"
},
{
"id": 2,
"img": "img-2.jpg",
"name": "Name 2"
},
{
"id": 3,
"img": "img-3",
"name": "Name 3"
}]
Run Code Online (Sandbox Code Playgroud)
所以我想要做的是在User表上查询来自Friends字段的所有内容,其中id等于3.
所以类似的东西:User::where('friends->id', 3)->orderBy('id', 'desc')->get();
当然,如果字段不包含数组,上面的例子可以完美地工作,所以如果它只是:
{
"id": 1,
"img": "img-1.jpg",
"name": "Name 1"
}
Run Code Online (Sandbox Code Playgroud)
绝望了,尽管我知道这是不是很符合逻辑,我试图用"其中": User::whereIn('friends->id', [3])->get()
.或者这样的东西:User::where('friends->[0]->id', 3)->get()
,User::where('friends->[*]->id', 3)->get()
,User::where('friends->*->id', 3)->get()
.
我也试过JSON_CONTAINS或JSON_SEARCH:User::whereRaw('JSON_CONTAINS(friends->"$.id", "3")')->get()
和许多不同的变种,但没有做到.
来到这里之前我已经阅读了一些有关此事的有趣文章(它们列在下面),但我似乎是唯一一个曾在MySQL数据库中存储过JSON数组的人,这怎么可能?^^
所以,如果有人能帮我解决这个问题,我真的很感激.附注:我当前的MySQL版本是5.7.11,因此它支持JSON字段,而Laravel不会抛出任何错误,它只返回一个空数组.
pat*_*cus 12
你的whereRaw
尝试非常接近.如果您存储的是单个对象,那么您的路径就是$.id
.但是,由于您要存储一组对象,因此您的路径是$[*].id
.这应该适合你:
User::whereRaw('JSON_CONTAINS(friends->"$[*].id", "3")')->get();
Run Code Online (Sandbox Code Playgroud)
该friends->"$[*].id"
选择器(这是这个的快捷方式JSON_EXTRACT()
)将返回的ID的JSON数组.JSON_CONTAINS()
然后将检查该json数组是否包含指定的id.
另一种选择是构建一个用于的json搜索字符串JSON_CONTAINS()
.例如,此查询也应该有效:
User::whereRaw('JSON_CONTAINS(friends, \'{"id": 3}\')')->get();
Run Code Online (Sandbox Code Playgroud)
这避免了第一次调用JSON_EXTRACT()
,所以你只调用一个json方法.我不知道哪个版本实际上会更快,或者是否会有任何差异.
此外,在与之相关的附注中JSON_SEARCH()
,此功能仅在您搜索字符串值时有效.由于你的json显示id表示为整数而不是字符串,JSON_SEARCH()
因此不起作用.MySQL声称这是预期的行为(bug 79233和dup bug 79316).
仅供参考,这里是json搜索方法的文档.