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

How to search through unknown property name in database with Laravel

我正在尝试使用 json 搜索包含 laravel 方法的数据库。这是我的 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", "11023235667", "1100012222225667"] |
+--------------------------------------------------------------------------------------+

使用它,您可以搜索结果数组:

SELECT ... FROM mytable 
WHERE JSON_SEARCH(JSON_EXTRACT(json, '$.row.*.ID'), 'one', '11023235667') IS NOT NULL;

您需要在 Laravel 中使用 whereRaw() 来执行此操作,因为 Laravel 没有此表达式的内置查询构建器函数。

提示:一旦您在 SQL 查询的 WHERE 子句中引用了 JSON 列,您的查询就会变得更难编写,更难优化。这应该是一个红旗,表明您的设计是错误的。您最好将数据存储在正常的行和列中,而不是 JSON.