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

Laravel Eloquent如何查询字符串格式对象列的嵌套属性?

解决Eloquent中查询字符串格式JSON字段指定属性的问题

你的type字段存储的是字符串格式的JSON对象,要查询其中b属性等于test的行,不用正则的话,最优方案是利用数据库原生的JSON处理函数,结合Eloquent实现,以下分数据库类型说明:

MySQL 实现方式

MySQL支持将字符串转为JSON类型后提取属性,可使用CAST()函数转换类型,配合->>运算符获取属性值:

$results = YourModel::whereRaw("CAST(type AS JSON)->>'$.b' = ?", ['test'])->get();

也可以用JSON_EXTRACT()函数等价实现:

$results = YourModel::whereRaw("JSON_EXTRACT(CAST(type AS JSON), '$.b') = ?", ['test'])->get();

PostgreSQL 实现方式

PostgreSQL通过::json语法将字符串转为JSON类型,再用->>获取属性:

$results = YourModel::whereRaw("type::json->>'b' = ?", ['test'])->get();

长期优化方案

如果这个字段需要频繁进行此类查询,强烈建议将字段类型改为数据库原生的JSON类型(MySQL的JSON、PostgreSQL的json/jsonb),这样不仅能简化查询语法,还能支持JSON索引提升查询性能:

修改字段类型(迁移示例)

Schema::table('your_table_name', function (Blueprint $table) {
    $table->json('type')->change();
});

修改后的简洁查询

字段改为JSON类型后,Eloquent支持直接用点语法查询:

$results = YourModel::where('type->b', 'test')->get();

为什么不推荐正则

正则匹配容易出现误判(比如匹配到包含test的其他属性值),且在数据量较大时,性能远不如数据库原生的JSON处理函数,原生函数会利用数据库的优化逻辑,效率更高。

内容的提问来源于stack exchange,提问作者Zein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:25:41