当前位置: 首页 > 面试题库 >

在包含JSON数组的JSON字段上进行Laravel 5.4查询

宣星光
2023-03-14
问题内容

我正在尝试查询包含值数组的JSON字段。例如,我们将表命名为“ User ”,并将字段命名为“ Friends ”。这是“朋友”字段的外观:

[{
    "id": 1,
    "img": "img-1.jpg",
    "name": "Name 1"
},
{
    "id": 2,
    "img": "img-2.jpg",
    "name": "Name 2"
},
{
    "id": 3,
    "img": "img-3",
    "name": "Name 3"
}]

因此,我想 在User表上查询来自Friends字段的所有内容,其中id等于3

就像这样:User::where('friends->id', 3)->orderBy('id', 'desc')->get();
当然,如果该字段不包含数组,那么上面的示例可以完美地工作,所以它只是:

{
    "id": 1,
    "img": "img-1.jpg",
    "name": "Name 1"
}

绝望了,尽管我知道这是不是很符合逻辑,我试图用“其中”: User::whereIn('friends->id', [3])->get()。或类似的东西:User::where('friends->[0]->id', 3)->get()User::where('friends->[*]->id', 3)->get()User::where('friends->*->id', 3)->get()

我还尝试了 JSON_CONTAINSJSON_SEARCH
User::whereRaw('JSON_CONTAINS(friends->"$.id", "3")')->get()和许多不同的变体,但没有任何作用。

在来到这里之前,我已经阅读了一些有趣的文章(下面列出了它们),但是我似乎是唯一将JSON数组存储在MySQL数据库中的人,这怎么可能?^^

  • https://mattstauffer.com/blog/new-json-column-where-and-update-syntax-in-laravel-5-3/
  • https://themsaid.com/laravel-myhtml" target="_blank">sql-json-colum-fast-lookup-20160709
  • http://www.qcode.in/use-mysql-json-field-in-laravel/

因此,如果有人可以帮助我解决这个问题,我将不胜感激。注意事项:我当前的MySQL版本是5.7.11,因此它确实支持JSON字段,并且Laravel不会抛出任何错误,它只返回一个空数组。


问题答案:

您的whereRaw尝试非常接近。如果存储单个对象,则路径为$.id。但是,由于要存储对象数组,因此路径为$[*].id。这应该为您工作:

User::whereRaw('JSON_CONTAINS(friends->"$[*].id", "3")')->get();

friends->"$[*].id"选择器(这是这个的快捷方式JSON_EXTRACT())将返回的ID的JSON数组。JSON_CONTAINS()然后将检查该json数组是否包含指定的ID。

另一个选择是构建用于的json搜索字符串JSON_CONTAINS()。例如,此查询也应工作:

User::whereRaw('JSON_CONTAINS(friends, \'{"id": 3}\')')->get();

这样避免了第一次调用JSON_EXTRACT(),因此您只调用了一个json方法。我不知道哪个版本实际上会更快,或者是否会有任何差异。

另外,在与相关的旁注中JSON_SEARCH(),此功能仅在您搜索字符串值时才有效。由于您的json显示ID是用整数而不是字符串表示的,因此JSON_SEARCH()将不起作用。MySQL声称这是预期的行为(错误79233和dup错误79316)。

仅供参考,以下是json搜索方法的文档。



 类似资料:
  • 问题内容: 我使用 PostgreSQL 9.5 和Rails5。我想查询下面显示的包含JSON对象数组的列,以返回包含并执行计数的所有JSON数组元素。我使用 的 SQL 显示在json数据下方。运行查询只会返回一个空数组。 这是我的数据: 我想要其中一个sql查询返回: 和另一个查询以返回数组,以便我可以在应用程序中对其调用count,还可以遍历它以创建表单: 我试过这个SQL查询: 我也试过

  • 我使用PostgreSQL 9.5和Rails 5。我想查询下面显示的包含JSON对象数组的jsonb列,以返回包含的所有JSON数组元素,并执行计数 我使用的SQL显示在json数据下面。运行查询只返回一个空数组。 我尝试了这里和这里建议的查询。 这就是我的jsonb数据的样子: 我希望其中一个sql查询返回: 和另一个返回数组的查询,以便我可以在我的应用程序中调用count并循环使用它来创建表

  • 问题内容: 我正在尝试查询Postgres数据库中的某个值。我在表中有一个命名字段,可以用以下两种方式之一表示: 1。 2。 我对这两种表示形式都满意。但是,我似乎无法找出如何让意甲5中的所有用户都说出来。我按照以下方式尝试了多个查询: 还有许多其他尝试,比其他尝试更愚蠢(请参见上文)。我该怎么办? 我已经能够确定: 但是,以下查询有效: 我认为我没有正确地传递列中的数据。我提供的创建的哈希是:

  • 问题内容: 我有一张桌子来存储有关我的兔子的信息。看起来像这样: 我该如何找到喜欢胡萝卜的兔子?我想出了这个: 我不喜欢那个查询。一团糟。 作为专职兔子管理员,我没有时间更改数据库架构。我只想适当地喂兔子。有没有更可读的方法来执行该查询? 问题答案: 从PostgreSQL 9.4开始,您可以使用operator: 如果改用 jsonb 类型,甚至可以在键上为查询建立索引: __ 当然,作为专职兔

  • 我试图在放置在PostgreSQL数据库中的JSON数组中找到特定值。我搜索了一些解决方案(在搜索smth时访问了所有链接,如“在json数组postgresql中查找值”),并尝试了它们,但没有成功,下面是我的最后一个工作示例: 这个解决方案只是打印出我的JSON列。我理解和的工作流程,但是对我来说很神奇。也许是原因? 我拥有的JSON结构: 因此,我需要了解如何提取值并找到我需要的值。提前谢谢

  • 问题内容: 我对angular有点陌生,我的json和ng-repeats遇到了问题。我有一个“模块”列表,然后是其中的“周”列表: 我的最终输出是一张表,我可以让模块重复,但是要让几周循环,我很难理解自己在做什么。这是我的模板: 这样将输出2个表,并带有正确的标题和描述,但是我似乎无法正确显示几周。请注意,某些“模块”有一个以上的“星期”。我不确定错误是否在模板或json中。 谢谢你的帮助。小号