Laravel Eloquent with位置搜索

问题描述

我正在尝试返回教师类型的用户列表,这些用户具有相关的教师资料,其相关的班级和位置,并且距离邮政编码在15英里之内。

如果没有该模型和用户的记录,似乎返回obj值为null的每种类型的每个用户,它会正确地将距离添加到位置,但不会按距离过滤,不知道为什么。

但是我只希望具有教师资料(教师模型)且位置在15英里以内的用户

我模型中的函数

<script>
function controlplay(e) {
  document.querySelectorAll('.playback').forEach(item => { if(item.id != e.target.id) item.pause(); });
}
</script>

<script>
document.querySelectorAll('.').forEach(item => { item.addEventListener("play",event => { controlplay(event) })});
</script>

控制器中的功能

 public function searchLocationsBydistance($query,$lat,$lng,$max_distance = 15){
    $query->getQuery()->locations = [];
    return $query->select('*')
                 ->selectRaw("( 3959 * acos( cos( radians($lat) ) * cos( radians( lat ) )  * cos( radians( lng ) - radians($lng) ) + sin( radians($lat) ) * sin(radians(lat)) ) ) AS distance")
                 ->having('distance','<=',$max_distance)
                 ->orderBy('distance');

}

任何人都可以建议我的查询出什么问题或指导我正确的方向。

解决方法

您的原始查询中的变量是否被正确替换?有几种方法可以做到这一点;

->selectRaw("...query some '$lat' more query...")

->selectRaw("...query some {$lat} more query...")

您也可以用另一种方式替换变量;

->selectRaw("...query some :lat more query...",['lat' => $lat])
,

您编写的 User 查询将返回所有内容,因为该查询没有过滤器。我认为使用Laravel方法whereHas()会对您有所帮助。

尝试一下,但是您需要根据我的猜测进行必要的调整,但这应该给您提供帮助的想法:

$instructors=\App\User::whereHas(['teacher',function($query) use($location){
     $query->with(['class','location' => function($q) use($location){
         $locations = new Location;
         $locations->searchLocationsByDistance($q,$location->lat,$location->lng);
     }])->where('type','==','instructor');
}])
    ->get();

此外-更新查询中的 Location 可能无法正常工作,并且看起来很复杂。您可能希望首先在内部查询中仅使用$query->with(['class','location']);,然后再在该集合上使用搜索位置方法,以提取经过过滤的教师列表。两种方式进行测试,以查看最有效/最有效的方法。