我想做的很简单: - 当计算的距离取决于用户的纬度和经度(在DB上)高于int时,我们通过添加where来从结果中删除当前用户 - 当该距离不高时,我们将自定义值添加到返回的结果
执行查询后,可以使用foreach轻松完成此操作:
%{} in {file()} and %{} =~ {file()}
这种方式的缺点是,如果我们有一个大型数据库,它将消耗大量的内存和时间,因为我们做两次直接在查询中应该做的事情。
我需要做的是在查询本身上执行此操作。我不知道该怎么做: - 在执行查询时直接向查询添加自定义值,并在查询中的when内进行距离计算,而不使用foreach但直接获取当前原始值以进行比较。
我现在在做什么:
foreach($search as $key => $value){
if(distance($value->latitude,$value->longitude,$user->latitude,$user->longitude,"K") > $distance) {
unset($search[$key]);
} else {
$search[$key]->distance = $calculatedDistance
}
}
->when($distance > 0, function ($query) use($distance, $longitude, $latitude){
$query->where(function ($subQuery) use ($longitude, $latitude,$distance) {
$cDistance = distance((int)$subQuery->value('latitude'),
(int)$subQuery->value('longitude'),
$latitude,
$longitude,
"K");
$subQuery->when(($cDistance > $distance),
function ($subQuery){
$subQuery->where('users.id', '<>', (int)$subQuery->value('id'));
},function ($subQuery) use ($cDistance) {
$subQuery->value((string)$cDistance.' as distance');
}
);
});
仅使用查询的第一个原始测试,而不是对所有行执行此操作。
$subQuery->value('something')
正在返回错误
SQLSTATE [42S22]:找不到列:1054未知列 “字段列表”中的'84 .354917445764'(SQL:选择
$subQuery->value((string)$cDistance.' as distance');
。84
为 来自354917445764
限制1)的distance
答案 0 :(得分:0)
$sqlDistance = DB::raw('ROUND ( 6371 * acos( cos( radians(' . $latitude . ') )
* cos( radians( doctor_profile.latitude ) )
* cos( radians( doctor_profile.longitude )
- radians(' . $longitude . ') )
+ sin( radians(' . $latitude . ') )
* sin( radians( doctor_profile.latitude ) ) ) )');
在查询中:
->selectRaw("{$sqlDistance} AS distance")
->when($distance > 0, function ($query) use ($distance,$sqlDistance){
$query->havingRaw('{$sqlDistance} <= ?', [$distance]);
})