选择,JSON数组包含的位置

时间:2017-09-05 12:39:43

标签: php mysql json laravel eloquent

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

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

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

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

检索colors包含的所有行的有效方法是什么?值red

4 个答案:

答案 0 :(得分:10)

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方法。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

此答案的更新,根据MySQLMariaDb,正确的语法必须为JSON_CONTAINS(@json, 'red', '$.colors'),并且必须使用{{1} }。

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

  

比如说@ElwinJSON_EXTRACT列必须包含以下JSON:meta

{ "colors": ["red", "blue", "green"] }

请记住在值句子中使用双引号。
User::whereRaw("JSON_CONTAINS(JSON_EXTRACT(meta, '$.colors'), '\"{$color}\"')")

答案 3 :(得分:-2)

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

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

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

有关Laravel's whereIn的更多信息。