在最近的开发中 遇到了一个较为鸡肋的问题 虽然常见 但是真正实现起来一波三折吧
首先这个是数据表 一个字段包含了多个id 我需要根据筛选进行查询
就是这样一个常见的功能 最终实现代码如下
$longitude = $request['lon'] == '' ? 31.23593 : $request['lon']; //经度 todo 测试
$latitude = $request['lat'] == '' ? 121.48054 : $request['lat']; //纬度
$distanceLimit = $request['distanceLimit'] == '' ? 100 : $request['distanceLimit']/1000;//距离 公里
$distanceExpr = "6371 * acos(
cos(radians($latitude)) * cos(radians(lat)) *
cos(radians(lon) - radians($longitude)) +
sin(radians($latitude)) * sin(radians(lat))
)";
if (isset($request['name']) && $request['name'] != '') {
$map[] = ['name', 'like', '%' . $request['name'] . '%'];
}
$page = $request['page'] == '' ? 1 : $request['page'];
$limit = $request['limit'] == '' ? 50: $request['limit'];
//未登录状态下 默认写死只展示 展示中房源 免费房源
$map[] = ['state', '=', 2];
$query = Db::name('room')
->order('is_up', 'desc')
->page($page, $limit)
->where($map)
->where('mark', 1)
->field('*, ' . $distanceExpr . ' AS distance')
->having('distance <' . $distanceLimit);
if (!empty($request['feature'])) {
$attributeIds = explode(',', $request['feature']);
$query->where(function ($query) use ($attributeIds) {
foreach ($attributeIds as $attributeId) {
$query->where('feature', 'LIKE', "%$attributeId%");
}
});
}
$data = $query->select()->toArray();
核心就在这一个DB的查询当中