繁体   English   中英

选择,JSON数组包含的位置

[英]Select, where JSON Array contains

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

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

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

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

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

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

JSON_CONTAINS(target, candidate[, path])

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

目前,Laravel的查询构建器不提供相应的API。 虽然有一个开放的内部提议

在此期间,您可以执行原始查询:

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

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

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

Laravel 5.6

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

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

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

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

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

所以他们,Laravel内部的代码(适用于5.5或更低版本)。

就像说@Elwin一样, meta列必须包含以下JSON: { "colors": ["red", "blue", "green"] }

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

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

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

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

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

更多关于Laravel的地点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM