【问题标题】:Trying to add a calculated distance to Eloquent尝试将计算出的距离添加到 Eloquent
【发布时间】:2018-02-07 16:26:54
【问题描述】:

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

这是我雄辩的查询: `

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

`

这是我得到的:

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

【问题讨论】:

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


    【解决方案1】:

    我正在尝试查找与用户当前位置的业务距离。 $request->latitude & $request->longitude 是用户的当前位置,将在请求中传递,我已经将企业的位置存储在名为 latitude 和 longitude 的数据库列中。 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 中的工作代码

    【讨论】:

    • 请添加必要的解释
    • 完成,请查看它如果还有更多信息,请告诉我。谢谢(Y)
    【解决方案2】:

    解决方案是 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();
    

    `

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 2017-11-15
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多