选择,其中JSON数组包含

选择,其中JSON数组包含

问题描述:

所以在Laravel 5有一个名为JSON WHERE子句使用MySQL的新能力,存储和获取JSON存储在列得心应手的事情:选择,其中JSON数组包含

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

将返回所有行,其中colorsmeta将被设置为red

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

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

+0

您的意思是$ x = ['red','blue','green'];或$ x =(colors => ['red','blue','green'])? –

+0

你试过WhereIn条件吗? –

+0

澄清:用户有一个属性/列,可以说它叫'meta',它包含以下JSON: '''{color}“:[”red“,”blue“,”green“] }''' 我想检索它,如果'colors'包含值'red'。 – Elwin

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

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

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

更多Laravel's whereIn

+0

我的意思基本上是其他方式:用户对象包含一个数组,并且我想检索它,如果_user_包含给定的值。 – Elwin

+0

OP所寻找的与“whereIn”产生的结果完全不同。看[why](https://*.com/a/46289938/65732)。 – sepehr

我觉得一个方法是使用运营商like

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

但是如果值永远不会包含字符"和分隔符不会改变这只会工作。

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()

+0

如何用数组变量替换这个[“red”]? –

+0

这已经是一个数组,你可以添加项目。查看'JSON_CONTAINS'文档以获取更多信息。 – sepehr