如何在 Eloquent 中查询 JSON 列内的数组

Posted

技术标签:

【中文标题】如何在 Eloquent 中查询 JSON 列内的数组【英文标题】:How to query array inside JSON column in Eloquent 【发布时间】:2021-02-27 16:13:51 【问题描述】:

我已经在 Eloquent 中使用 JSON 成功完成了一些查询,但是我不知道如何从这样的数组中的对象中查询值:

在“属性”列中,有:


    "products": [
        
            "media": "1",
            "code": "4186GSB"
        ,
        
            "media": "2",
            "code": "4186GSE"
        
    ]

我想查询“媒体”=1

到目前为止我已经尝试过:

$query->where('attributes->products->media', 1); // failed
// or
$query->where('attributes->products[*]->media', 1); // failed

我不知道如何使用原始查询,但如果这是解决方案也没关系!

【问题讨论】:

这不是您想听到的,但最好的选择是从 json 列中获取数据。如果您需要在查询中使用数据,它应该在表中有自己的列。在这种情况下,您应该有一个产品表。看起来你有一个代码和一个媒体。媒体参考什么?看起来它应该是 media_types 表的外键。 @Akina,我删除了一些键,JSON 没问题。已在帖子中修复它们。 @JamesClarkDeveloper 媒体来自另一个来源,它们还没有在 mysql 中。但是,我使用的是原生 MySQL JSON 列类型。 在 MySQL 中,您不能同时按键和值进行搜索。而且您无法搜索多实例。为显示的 JSON 和搜索条件提供所需的输出。 【参考方案1】:

像这样访问数据

$product=$yourdata['products'][0];

【讨论】:

是的!我已经习惯了:D【参考方案2】:

你需要使用 whereJsonContains() 查询方法来查询一个 json 数组(从 Laravel 5.6.24 开始可用)。您的查询如下所示:

$query->whereJsonContains('attributes', ['products' => ['media' => '1']]);

如果您使用的是早期版本并且没有此功能可用,您可以使用原始查询:

$query->whereRaw(
    'json_contains(attributes, ?)',
    [
        json_encode(['products' => ['media' => '1']])
    ]
);

【讨论】:

谢谢!我不知道可以像这样嵌套数组:('attributes', ['products' => ['media' => '1']]) 谢谢@patricus 我认为这应该记录在 Laravel 文档中 JsonContains 非常适用于 MySql,但你可以。 sqlite有什么解决方案吗?我试过玩 whereRaw 和 json casts 但成功了。

以上是关于如何在 Eloquent 中查询 JSON 列内的数组的主要内容,如果未能解决你的问题,请参考以下文章

将新的键/值对添加到 PostgreSQL JSON 列内的嵌套数组中

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

如何使引导卡拉伸到列内的屏幕高度?

骨架:列内的两个嵌套行 - 如何?

熊猫列内的映射值

IE10 最大宽度在固定布局表列内的图像上失败