一个员工有许多员工区域,我需要检查哪些员工的员工区域在$ latlgcol集合中任何点的12km范围内。
我需要知道我是否正在尝试做一些有可能的事情,或者我是否应该查看DB原始查询和存储过程/MySQL函数。
正如你所看到的,我正在调用一个函数LatLngToLatLng(),并试图传递/投影查询的结果到它。
$employees = Employee::whereHas('employeeareas',function($query) use($latLngCol) {
$query->where(function($ca) use($latLngCol) {
$latLngCol->first(function($key, $val) use($ca) {
$m = DistanceCalculator::LatLngToLatLng($val['lat'],$val['lng'],$ca->select('latitude')->first(), $ca->select('longitude')->first());
if($m <= 12000) return true;
});
}
)->first();
});
在。net中,使用实体框架,它看起来像这样:
var employees =
employee.where(e => e.employeeareas
.first(ea => LatLngList
.first(p => calculateDistance(ea.lat, ea.lng, p.lat, p.lng))
)).toList;
我需要知道我是否可以写出类似的东西,而不必诉诸RAW查询。
你不能用eloquent来写。net。
但是Laravel提供集合类。你可以在集合中使用filter方法,通过给定的回调来过滤集合。
示例如果您有一个名为$collection
的集合,那么您可以使用如下函数对其进行过滤
$filtered = $collection->filter(function ($value, $key) {
return $value > 2;
});
$filtered->all();
既然你的查询是复杂的,最好使用你的代码方式。如果你收集你的问题