You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel 5.6中对JSON类型字段(desc)进行查询?

嘿,我来帮你搞定Laravel 5.6里这个JSON数组字段的查询问题!你的desc字段是JSON数组类型,下面几种常见的查询场景我都给你整理好了,直接就能用:

1. 查询包含特定键值对的记录

比如要找出所有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的关键字,所以要给字段名加反引号避免语法报错。

2. 查询数组中某个字段匹配指定值的记录

如果要找所有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();
3. 统计数组中特定值的出现次数

要是你想统计每条记录里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,方便后续调用。

4. 查询数组长度大于指定值的记录

比如要找desc数组元素数量超过5的记录,Laravel没有直接封装这个方法,我们用whereRaw调用MySQL的JSON_LENGTH函数就行:

$records = DB::table('your_table_name')
    ->whereRaw('JSON_LENGTH(`desc`) > 5')
    ->get();
5. 查询数组中特定位置的元素值

如果要找数组第一个元素的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:42:55