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
相关产品推荐
相关产品推荐

