如何在Laravel 5.6中对JSON类型字段(desc)进行查询?
嘿,我来帮你搞定Laravel 5.6里这个JSON数组字段的查询问题!你的desc字段是JSON数组类型,下面几种常见的查询场景我都给你整理好了,直接就能用:
比如要找出所有desc数组里存在club为CHE的记录,Laravel 5.6封装了whereJsonContains方法,用起来超方便:
$records = DB::table('your_table_name') ->whereJsonContains('`desc`', ['club' => 'CHE']) ->get();
这里要注意两个点:一是你的MySQL版本得是5.7.8及以上,因为这个方法依赖MySQL的JSON_CONTAINS函数;二是desc是MySQL的关键字,所以要给字段名加反引号避免语法报错。
如果要找所有desc数组里有元素country等于ENGLAND的记录,同样用whereJsonContains,两种写法都可行:
// 写法一:指定键值对 $records = DB::table('your_table_name') ->whereJsonContains('`desc`', ['country' => 'ENGLAND']) ->get(); // 写法二:直接指定字段路径 $records = DB::table('your_table_name') ->whereJsonContains('`desc`->country', 'ENGLAND') ->get();
要是你想统计每条记录里club为CHE的次数,可以用原生SQL结合Laravel的selectRaw来实现:
$records = DB::table('your_table_name') ->selectRaw('*, JSON_LENGTH(JSON_SEARCH(`desc`, "all", "CHE", null, "$[*].club")) as che_count') ->get();
这里JSON_SEARCH会找出所有club为CHE的路径,JSON_LENGTH用来统计这些路径的数量,最后给统计值起别名che_count,方便后续调用。
比如要找desc数组元素数量超过5的记录,Laravel没有直接封装这个方法,我们用whereRaw调用MySQL的JSON_LENGTH函数就行:
$records = DB::table('your_table_name') ->whereRaw('JSON_LENGTH(`desc`) > 5') ->get();
如果要找数组第一个元素的club是CHE的记录,可以直接通过索引访问JSON路径:
$records = DB::table('your_table_name') ->where('`desc`->[0]->club', 'CHE') ->get();
这里->[0]就是访问数组的第一个元素,后面的->club用来取该元素的club字段值。
另外,如果你用Eloquent模型的话,建议在模型里加上$casts属性,把desc字段转成数组,这样你在代码里操作这个字段的时候会更顺手:
protected $casts = [ 'desc' => 'array', ];
内容的提问来源于stack exchange,提问作者moses toh

