laravel:使用join和scope查询

lnlaulya  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(361)

我的 user 班上有许多人 address 班级。这个 address 类具有作用域查询函数以获取区域附近的所有地址:

public static function scopeGetByDistance($query,$lat, $lng, int $max_distance)
{
     return $query->selectRaw('id, lat, lng, profileAddress.idMember, ( 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 );
}

我要获取所有具有以下地址的用户 max_distance 对某些人来说 (lat,lng) 我想按这个距离排列。
如何使用查询生成器实现这一点?我试过这个:

$users = \App\User::leftJoin('addresses', function($join){
    $join->getByDistance(44.81, 20.46, 20);
  })
    ->select(DB::raw('MIN(distance) as closest'))
    ->groubBy('user.id')
    ->orderBy('closest')
    ->get();

但这会导致
方法\database\query\joinclause::getbydistance不存在。

polkgigr

polkgigr1#

试试这个

$users = DB::table('users as u')
   ->join('address as ad','u.id','=','ad.uset_id');
   ->select(DB::raw('(6371 * acos(cos(radians('.$lat.')) * cos(radians(lat)) * cos(radians(lng) - radians('.$long.')) + sin(radians('.$lat.')) * sin(radians(lat )))) AS distance'))
   ->having('distance','<',$max_distance)         
   ->get();
kqqjbcuj

kqqjbcuj2#

好吧,我刚发现加入和关系不受拉威尔的支持
这就是我最后所做的:

$users = \App\User::leftJoin('profileAddress','users.id','=','profileAddress.id')
   ->selectRaw('profileAddress.*,   MIN(3959 * acos( cos( radians( '. $lat.') ) * cos( radians( profileAddress.lat ) ) * cos( radians( profileAddress.lng ) - radians(' . $lng . ') ) + sin( radians(' . $lat .') ) *  sin( radians(lat) ) ) ) as closest')
    ->groupBy('users.id')
    ->having('closest', '<', 20)
    ->orderBy('closest')
    ->get();

相关问题