php - 拉拉维尔 : Use join and scope query

标签 php mysql laravel-5 laravel-query-builder

我的用户hasMany 地址类。 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();

但这会导致

Method Illuminate\Database\Query\JoinClause::getByDistance does not exist.

最佳答案

好吧,我刚刚发现 join and relationships are not supported by Laravel

这就是我最终所做的:

 $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();

关于php - 拉拉维尔 : Use join and scope query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51779054/

相关文章:

javascript - 更改部分网址文本并重新加载页面

php - CMS 完全使用 OOP 构建?

php - 单个页面上有多个网格

php - 警告 1264 超出为列(日期时间列)调整的值范围

laravel - 插入相关型号: "Field doesn' t have a default value"

php - Laravel Scheduler - 如何输出链式/系列命令?

mysql - SQL 查询在数据库客户端中有效,但在 Laravel 应用程序中无效

php - preg_match_all 从下往上读取?

javascript - 如何将时刻 JS 时间插入 MySQL

php - 操作两个 MySQL 表并获取第三个表