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

3

我已成功使用Eloquent中的JSON进行了一些查询,但我无法弄清如何查询数组内部对象的值,例如:

在“attributes”列中,有:

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

我想要查询 "media" = 1

目前我已经尝试了以下方法:

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

我不知道如何使用原始查询,但如果那是解决方案的话,那就没有关系!


这可能不是你想听到的,但最好的选择是从json列中获取数据。如果需要在查询中使用数据,则应该在表中拥有自己的列。在这种情况下,您应该有一个产品表。看起来你有一个代码和一个媒体。媒体引用了什么?那似乎应该是指向媒体类型表的外键。 - James Clark
@Akina,我删除了一些键,JSON 没问题了。我已经在帖子中修复了它们。 - Gilberto Albino
@JamesClarkDeveloper 媒体文件来自另一个来源,尚未存入MySQL。不过,我正在使用本机MySQL JSON列类型。 - Gilberto Albino
在MySQL中,您不能同时按键和值进行搜索。而且您也不能搜索多个实例。请提供所示JSON和搜索条件的期望输出。 - Akina
2个回答

6

如果您需要查询一个 JSON 数组,可以使用 whereJsonContains() 查询方法(该方法从 Laravel 5.6.24 开始提供)。您的查询可能如下所示:

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

如果你使用的是早期版本,该功能不可用,你可以使用原始查询:
$query->whereRaw(
    'json_contains(attributes, ?)',
    [
        json_encode(['products' => ['media' => '1']])
    ]
);

1
谢谢!我不知道可以像这样嵌套数组:('attributes',['products' => ['media' => '1']]) - Gilberto Albino
谢谢@patricus,我认为这应该记录在Laravel文档中。 - Sagar Naliyapara
JsonContains 在 MySql 中运行得非常完美,但是你有没有针对 sqlite 的解决方案?我尝试过使用 whereRaw 和 json 转换,但都没有成功。 - abr

0
访问数据的方法如下:

像这样

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

是的!我已经习惯了:D - Gilberto Albino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接