如何在 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 列内的嵌套数组中