选择,其中JSON数组包含
所以在Laravel 5有一个名为JSON WHERE子句使用MySQL的新能力,存储和获取JSON存储在列得心应手的事情:选择,其中JSON数组包含
User::where('meta->colors', 'red')->get()
将返回所有行,其中colors
列meta
将被设置为red
。
现在让我们假设colors
不是一个字符串,而是一个包含多种颜色的数组(colors => ['red', 'blue', 'green']
)。
什么是检索所有行的有效方式,其中colors
包含例如价值red
?
whereIn
方法验证给定列的值是否包含在给定数组中。 试试这个:
$colorArray = ['red', 'blue', 'green'];
$user = User::whereIn('meta->color', $colorArray)->get();
我觉得一个方法是使用运营商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()
。
如何用数组变量替换这个[“red”]? –
这已经是一个数组,你可以添加项目。查看'JSON_CONTAINS'文档以获取更多信息。 – sepehr
您的意思是$ x = ['red','blue','green'];或$ x =(colors => ['red','blue','green'])? –
你试过WhereIn条件吗? –
澄清:用户有一个属性/列,可以说它叫'meta',它包含以下JSON: '''{color}“:[”red“,”blue“,”green“] }''' 我想检索它,如果'colors'包含值'red'。 – Elwin