我目前的固定半径为 50km,这是一个 ENV 常数,用于查找特定坐标集的 X 半径内的所有用户。我想要实现的是允许用户设置自己的半径,最大可达 50 公里,并在搜索中使用该值。
User::selectRaw('*, (6371 * acos (cos ( radians('.$lat.') ) * cos( radians( addressLat ) ) * cos( radians( addressLong ) - radians('.$lng.') ) + sin ( radians('.$lat.') ) * sin( radians( addressLat ) ))) AS distance')->orderBy('distance')->having('distance', '<', $radius)->whereNotNull('phone_number')->where('should_receive_quotes', '!=', '0')->get();
$radius = env('RADIUS',50);
是当前变量。
是否可以使用用户表半径内的值来检查该用户是否在给定坐标的半径及其自定义半径内?如果用户半径列中没有设置值,则默认为 50 公里。
我希望能够使用
users
表中的值作为 RawQuery 的一部分id | 纬度 | lng | 半径 |
---|---|---|---|
1 | 51.500836 | -1.159058 | 80 |
2 | 51.164490 | -0.466919 | 空 |
3 | 52.39103 | -2.91020 | 空 |
报价表:
id | 纬度 | lng |
---|---|---|
1 | 51.267715 | -0.214233 |
根据上述数据,对于报价 ID 1,我希望它返回用户 1 和 2。根据自定义,用户 2 将在报价 ID 1 的默认 50 公里范围内,用户 1 将在报价 ID 1 的 80 公里范围内在用户表
radius
列中定义的半径。用户 3 不会被返回,因为它有一个 NULL
radius
列,并且位于默认 50 公里半径之外。
使用 COALESCE 将动态半径应用于每个用户
->having('distance', '<', DB::raw('COALESCE(radius, ' . $radius . ')'))