使用Eloquent与原生SQL提取MySQL JSON中的地址经纬度字段
从MySQL JSON字段提取地址信息用于地图仪表盘
我来帮你搞定从MySQL存储的JSON地址数据里提取name、纬度lat和经度lng的需求,不管是用原生SQL还是Laravel Eloquent都有对应的方案,下面给你详细示例:
原生SQL查询方案
MySQL 5.7+支持JSON字段操作,你可以用->>操作符(或者JSON_UNQUOTE(JSON_EXTRACT()))直接提取JSON中的嵌套字段,这个操作符会自动去除结果的引号,直接返回纯文本/数值:
SELECT address_column->>'$.name' AS name, address_column->>'$.latlng.lat' AS lat, address_column->>'$.latlng.lng' AS lng FROM your_table_name;
注意:把address_column换成你实际存储JSON数据的字段名,your_table_name换成对应的表名
Laravel Eloquent查询方案
如果用Laravel的Eloquent ORM,有两种常用方式可以实现:
方法一:直接使用selectRaw复用SQL逻辑
$mapmarkerscalc = DB::table('your_table_name') ->selectRaw("address_column->>'$.name' as name") ->selectRaw("address_column->>'$.latlng.lat' as lat") ->selectRaw("address_column->>'$.latlng.lng' as lng") ->get();
方法二:结合模型JSON字段映射(更优雅)
先在你的模型类里把JSON字段声明为数组类型,让Laravel自动处理转换:
// 你的模型文件,比如Address.php class Address extends Model { protected $casts = [ 'address_column' => 'array', // 将JSON字段映射为PHP数组 ]; }
然后就可以用更简洁的查询写法:
$mapmarkerscalc = Address::selectRaw(" address_column->>'$.name' as name, address_column->>'$.latlng.lat' as lat, address_column->>'$.latlng.lng' as lng ")->get();
这样查询出来的$mapmarkerscalc集合里的每个对象都会包含name、lat和lng字段,直接就能用于地图仪表盘的标记渲染啦。
内容的提问来源于stack exchange,提问作者Braedon Saunders
相关产品推荐
相关产品推荐

