【问题标题】:Select, where JSON Array contains选择,其中 JSON 数组包含
【发布时间】:2018-02-13 18:20:45
【问题描述】:

所以在 Laravel 5 中有一个方便的东西,叫做 JSON Where Clauses,它使用 MySQL 存储和获取存储在列中的 JSON 的新功能:

User::where('meta->colors', 'red')->get()

将返回所有行,其中meta 列中的colors 将设置为red

现在假设colors 不是字符串,而是包含多种颜色的数组 (colors => ['red', 'blue', 'green'])。

什么是检索所有行的有效方法,其中colors 包含例如值red?

【问题讨论】:

  • 你的意思是 $x = ['red', 'blue', 'green'];或 $x = (colors => ['red', 'blue', 'green']) ?
  • 你试过WhereIn条件???
  • 澄清:用户有一个属性/列,假设它被称为meta,其中包含以下JSON:{ "colors": ["red", "blue", "green"] }我想检索它,如果colors包含值red.

标签: php mysql json laravel eloquent


【解决方案1】:

JSON_CONTAINS() 完全符合您的要求:

JSON_CONTAINS(target, candidate[, path])

通过返回 1 或 0 来指示给定的候选 JSON 文档是否包含在目标 JSON 文档中,或者——如果提供了路径参数——是否在目标内的特定路径中找到候选。 — 12.16.3 Functions That Search JSON Values

目前,Laravel 的查询构建器不提供相应的 API。不过有一个open internals proposal

与此同时,您可以执行原始查询:

\DB::table('users')->whereRaw(
    'JSON_CONTAINS(meta->"$.colors", \'["red"]\')'
)->get();

这将返回所有在其meta->colors JSON 字段中具有“红色”的用户。请注意,-> operator 需要 MySQL 5.7.9+。

您也可以直接在 Eloquent 模型上调用 whereRaw()

Laravel 5.6

从 5.6 版本开始,Laravel 的查询构建器包含一个新的 whereJsonContains 方法。

【讨论】:

  • 如何将这个 ["red"] 替换为数组变量?
  • 这已经是一个数组了,你可以往里面添加项目。查看JSON_CONTAINS 文档了解更多信息。
  • 看起来 Laravel 5.7 将包含用于 MySQL、PostgreSQL 和 SQL Server 的 whereJsonContainsgithub.com/laravel/framework/pull/24330
  • whereJsonContains 在 Laravel 5.6 中引入
  • @SamuelReid 更新了答案。谢谢。
【解决方案2】:

我认为一种方法是使用like 运算符:

User::where('meta->colors', 'like', '%"red"%')

但是,这仅在值从不包含字符 " 并且分隔符不会更改时才有效。

【讨论】:

  • 谢谢你的朋友
【解决方案3】:

对此答案的更新,根据MySQLMariaDb,正确的语法必须是JSON_CONTAINS(@json, 'red', '$.colors'),并且必须使用JSON_EXTRACT

所以他们,Laravel 中的代码(对于 5.5 或更低版本)。

比如@Elwinmeta 列必须包含以下 JSON:{ "colors": ["red", "blue", "green"] }

User::whereRaw("JSON_CONTAINS(JSON_EXTRACT(meta, '$.colors'), '\"{$color}\"')")

记得在值句中使用双引号。
JSON_CONTAINS(JSON_EXTRACT(meta, '$.colors'), '"red"')

【讨论】:

  • 这在我的 Laravel 6.x 和 mariadb 10.x 上完美运行
【解决方案4】:

whereIn 方法验证给定列的值是否包含在给定数组中。 试试这个:

$colorArray = ['red', 'blue', 'green'];

$user = User::whereIn($meta->color, $colorArray)->get();

更多关于Laravel's whereIn

【讨论】:

  • 我的意思基本上是相反的:用户对象包含一个数组,如果 user 包含给定的值,我想检索它。
  • OP 寻找的东西与whereIn 产生的东西完全不同。见why
猜你喜欢
  • 1970-01-01
  • 2021-03-12
  • 2021-12-20
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多