微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Laravel 在数据库中搜索未知的属性名称

如何解决如何使用 Laravel 在数据库中搜索未知的属性名称

我正在尝试使用 json contains 方法搜索数据库。这是我的一个数据库行的 JSON:

{
    "row": {
        "1": {
            "ID":"110555175667"
        },"2": {
            "ID":"11023235667"
        },"3": {
            "ID":"11001414141667"
        },"4": {
            "ID":"11023235667"
        },"5": {
            "ID":"1100012222225667"
        },}
}

我想搜索 ID,但如您所见,有数字作为属性

在示例中,我想找到 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 举报,一经查实,本站将立刻删除。