如何解决如何使用 Laravel 在数据库中搜索未知的属性名称
我正在尝试使用 json contains 方法搜索数据库。这是我的一个数据库行的 JSON:
{
"row": {
"1": {
"ID":"110555175667"
},"2": {
"ID":"11023235667"
},"3": {
"ID":"11001414141667"
},"4": {
"ID":"11023235667"
},"5": {
"ID":"1100012222225667"
},}
}
在示例中,我想找到 11023235667
。我试过这样:
->whereJsonContains('json',[['row' => ['1' => ['ID' => '11023235667']]]])
但是没有用。我该怎么做?
编辑:
我也试过这个:
->whereRaw('JSON_CONTAINS(json,"$.row.*.ID","11023235667")')
我知道 row
的属性必须是 JSON 数组才能完成匹配 id,但它已被设置为 JSON 对象
解决方法
JSON_CONTAINS() 的用法接受 JSON 文档作为其第二个参数,而不是路径。
您可以使用该路径将 ID 提取到数组中:
SELECT JSON_EXTRACT(json,'$.row.*.ID') FROM ...
+--------------------------------------------------------------------------------------+
| ["110555175667","11023235667","11001414141667","1100012222225667"] |
+--------------------------------------------------------------------------------------+
使用它,您可以搜索结果数组:
SELECT ... FROM mytable
WHERE JSON_SEARCH(JSON_EXTRACT(json,'$.row.*.ID'),'one','11023235667') IS NOT NULL;
您需要在 Laravel 中使用 whereRaw()
执行此操作,因为 Laravel 没有针对此表达式的内置查询构建器函数。
提示:一旦您在 SQL 查询的 WHERE
子句中引用了 JSON 列,您的查询就会变得更难编写,也更难优化。这应该是一个危险信号,表明您的设计是错误的。您最好将数据存储在普通的行和列中,而不是 JSON。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。