试图将计算的距离添加到Eloquent

时间:2018-02-07 16:26:54

标签: laravel-5 query-builder laravel-eloquent

我正在尝试添加在Model :: get()方法中计算的距离。距离应标记为“距离”,而现在它不返回任何内容(没有添加选择)。

这是我的Eloquent查询: `

Candidate::whereHas('positions', function($query) use ($data) {
           $query->where('positions.id', $data['position']);
        })
        ->whereHas('user', function($query) use ($data) {
           $query->where('status', '=', 1);
           if($data['lat'] !== null and $data['lng'] !== null){
           $query->whereHas('address', function($query) use ($data) {
           $sqlDistance = DB::raw('( 111.045 * acos( cos( radians(' . $data['lat'] . ') ) * cos( radians( addresses.latitude ) ) 
* cos( radians( addresses.longitude ) - radians(' . $data['lng']  . ') ) 
+ sin( radians(' . $data['lat']  . ') ) * sin( radians( addresses.latitude ) ) ) )');
           $query->selectRaw("{$sqlDistance} AS distance");
          });
         }
         })->with('user.address','user','user.media')
         ->get();

`

这是我得到的:

enter image description here

任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:1)

我正在尝试查找距用户当前位置的营业距离。 $request->latitude$request->longitude是将在请求中传递的用户的当前位置,我已经将业务位置存储在名为latitudelongitude的数据库列中。 selectSub()用于在数据记录中添加列。它将包含两个参数,第一个是函数或列名,第二个是新列名。

Business::with(['user','category'])
    ->select('*')
    ->selectSub('(111.111 *
        DEGREES(ACOS(LEAST(1.0, COS(RADIANS(latitude))
            * COS(RADIANS('.$request->latitude.'))
            * COS(RADIANS(longitude - '.$request->longitude.'))
            + SIN(RADIANS(latitude))
            * SIN(RADIANS('.$request->latitude.'))))))','distance_in_km')
    ->orderBy('distance_in_km','ASC')
    ->take($limit)
    ->skip($offset)->get();

这是我在laravel中工作的代码

答案 1 :(得分:0)

解决方案是Eloquent和Query Builder之间的混合:

`

Candidate::select('candidates.*')
            ->whereHas('positions', function ($query) use ($data) {
                $query->where('positions.id', $data['position']);
            })
            ->whereHas('user', function ($query) use ($data) {
                $query->where('status', '=', 1);
                $query->whereHas('address', function ($query) use ($data) {
                    if($data['country'] !== null){
                        $query->where('country', '=', $data['country']);
                    }
                });
            })
            ->leftJoin('users', 'users.id', 'candidates.user_id')
            ->with('user.address', 'user', 'user.media','reviews')
            ->leftJoin('addresses', 'addresses.id', 'users.address_id')
            ->addSelect(DB::raw("{$sqlDistance} AS distance") )
            ->get();

`