paginate() 在使用 having() 时抛出错误,而 get() 显示结果
paginate() throws error while using having() while get() shows the results
代码:
if ($request->going){
if($request->lattitude && $request->longitude){
$CurrentIplat = $request->lattitude;
$CurrentIplon = $request->longitude;
$ads1 = DB::table('ads')
->leftJoin('categories', 'ads.category_id', '=', 'categories.id')
->select(
'ads.*','categories.category_name',
DB::raw("( 6371 * acos( cos( radians('{$CurrentIplat}') ) * cos( radians( ads.Latitude ) ) * cos( radians( ads.Longtitute ) - radians({$CurrentIplon}) ) + sin( radians({$CurrentIplat}) ) * sin( radians( ads.Latitude ) ) ) ) AS distance")
)
->where('ads.domain',$this->domain)
->groupBy('ads.id')
->orderBy('distance')
->having('distance','<','500')
->get();
}
}
提供正确的输出。
在使用 paginate() 时
if ($request->going){
if($request->lattitude && $request->longitude){
$CurrentIplat = $request->lattitude;
$CurrentIplon = $request->longitude;
$ads1 = DB::table('ads')
->leftJoin('categories', 'ads.category_id', '=', 'categories.id')
->select(
'ads.*','categories.category_name',
DB::raw("( 6371 * acos( cos( radians('{$CurrentIplat}') ) * cos( radians( ads.Latitude ) ) * cos( radians( ads.Longtitute ) - radians({$CurrentIplon}) ) + sin( radians({$CurrentIplat}) ) * sin( radians( ads.Latitude ) ) ) ) AS distance")
)
->where('ads.domain',$this->domain)
->groupBy('ads.id')
->orderBy('distance')
->having('distance','<','500')
->paginate(10);
}
}
它抛出
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'distance' in 'having clause' (SQL: select count(*) as aggregate from `ads` left join `categories` on `ads`.`category_id` = `categories`.`id` where `ads`.`domain` = nz group by `ads`.`id` having `distance` < 5000)
paginate()
Laravel 中的函数,执行两个查询:
- 首先,在你的文件中获取给定分页限制的记录,比如 10
案件。
- 其次,根据给定的位置获取记录总数
条件。
问题出在第二个查询中,其中 count(*) as aggregate
是唯一选择的字段,没有像 distance
这样的字段可以执行 having 操作。
只有 get()
函数起作用,因为它只执行一个查询来获取具有给定 where 条件的所有记录。
解决方案: 在where
中使用距离条件而不是having
,因为它更有效。但是这里相同的距离计算需要再次编写,因为 where 条件不适用于别名。代码应为:
if ($request->lattitude && $request->longitude) {
$CurrentIplat = $request->lattitude;
$CurrentIplon = $request->longitude;
$queryDistance = " ( 6371 * acos( cos( radians('{$CurrentIplat}') ) * cos( radians( ads.Latitude ) ) * cos( radians( ads.Longtitute ) - radians({$CurrentIplon}) ) + sin( radians({$CurrentIplat}) ) * sin( radians( ads.Latitude ) ) ) ) ";
$ads1 = DB::table('ads')
->leftJoin('categories', 'ads.category_id', '=', 'categories.id')
->select('ads.*', 'categories.category_name', DB::raw("$queryDistance AS distance"))
->whereRaw('ads.domain = ' . $this->domain . " AND $queryDistance < 500")
->groupBy('ads.id')
->orderBy('distance')
->paginate(10);
}
使用 paginate
Laravel 首次启动时
SELECT count(*)
查询获取记录的数量,所以因为在这个查询中你也有 having('distance', '<', '500')
显然 SQL 不知道这个查询中的 distance
是什么。这里的解决方案是使用手动分页(更复杂的)或重复距离定义两次:
$distance = "( 6371 * acos( cos( radians('{$CurrentIplat}') ) * cos( radians( ads.Latitude ) ) * cos( radians( ads.Longtitute ) - radians({$CurrentIplon}) ) + sin( radians({$CurrentIplat}) ) * sin( radians( ads.Latitude ) ) ) )";
if ($request->going){
if($request->lattitude && $request->longitude){
$CurrentIplat = $request->lattitude;
$CurrentIplon = $request->longitude;
$ads1 = DB::table('ads')
->leftJoin('categories', 'ads.category_id', '=', 'categories.id')
->select(
'ads.*','categories.category_name',
DB::raw($distance.' AS distance'))
->where('ads.domain',$this->domain)
->groupBy('ads.id')
->orderBy('distance')
->having(DB::raw($distance),'<','500')
->paginate(10);
}
}
因此,正如您在上面看到的那样,distance
列被提取到 $distance
变量,然后它被使用了两次 - 第一次在 select
中,第二次在 having
代码:
if ($request->going){
if($request->lattitude && $request->longitude){
$CurrentIplat = $request->lattitude;
$CurrentIplon = $request->longitude;
$ads1 = DB::table('ads')
->leftJoin('categories', 'ads.category_id', '=', 'categories.id')
->select(
'ads.*','categories.category_name',
DB::raw("( 6371 * acos( cos( radians('{$CurrentIplat}') ) * cos( radians( ads.Latitude ) ) * cos( radians( ads.Longtitute ) - radians({$CurrentIplon}) ) + sin( radians({$CurrentIplat}) ) * sin( radians( ads.Latitude ) ) ) ) AS distance")
)
->where('ads.domain',$this->domain)
->groupBy('ads.id')
->orderBy('distance')
->having('distance','<','500')
->get();
}
}
提供正确的输出。
在使用 paginate() 时
if ($request->going){
if($request->lattitude && $request->longitude){
$CurrentIplat = $request->lattitude;
$CurrentIplon = $request->longitude;
$ads1 = DB::table('ads')
->leftJoin('categories', 'ads.category_id', '=', 'categories.id')
->select(
'ads.*','categories.category_name',
DB::raw("( 6371 * acos( cos( radians('{$CurrentIplat}') ) * cos( radians( ads.Latitude ) ) * cos( radians( ads.Longtitute ) - radians({$CurrentIplon}) ) + sin( radians({$CurrentIplat}) ) * sin( radians( ads.Latitude ) ) ) ) AS distance")
)
->where('ads.domain',$this->domain)
->groupBy('ads.id')
->orderBy('distance')
->having('distance','<','500')
->paginate(10);
}
}
它抛出
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'distance' in 'having clause' (SQL: select count(*) as aggregate from `ads` left join `categories` on `ads`.`category_id` = `categories`.`id` where `ads`.`domain` = nz group by `ads`.`id` having `distance` < 5000)
paginate()
Laravel 中的函数,执行两个查询:
- 首先,在你的文件中获取给定分页限制的记录,比如 10 案件。
- 其次,根据给定的位置获取记录总数 条件。
问题出在第二个查询中,其中 count(*) as aggregate
是唯一选择的字段,没有像 distance
这样的字段可以执行 having 操作。
只有 get()
函数起作用,因为它只执行一个查询来获取具有给定 where 条件的所有记录。
解决方案: 在where
中使用距离条件而不是having
,因为它更有效。但是这里相同的距离计算需要再次编写,因为 where 条件不适用于别名。代码应为:
if ($request->lattitude && $request->longitude) {
$CurrentIplat = $request->lattitude;
$CurrentIplon = $request->longitude;
$queryDistance = " ( 6371 * acos( cos( radians('{$CurrentIplat}') ) * cos( radians( ads.Latitude ) ) * cos( radians( ads.Longtitute ) - radians({$CurrentIplon}) ) + sin( radians({$CurrentIplat}) ) * sin( radians( ads.Latitude ) ) ) ) ";
$ads1 = DB::table('ads')
->leftJoin('categories', 'ads.category_id', '=', 'categories.id')
->select('ads.*', 'categories.category_name', DB::raw("$queryDistance AS distance"))
->whereRaw('ads.domain = ' . $this->domain . " AND $queryDistance < 500")
->groupBy('ads.id')
->orderBy('distance')
->paginate(10);
}
使用 paginate
Laravel 首次启动时
SELECT count(*)
查询获取记录的数量,所以因为在这个查询中你也有 having('distance', '<', '500')
显然 SQL 不知道这个查询中的 distance
是什么。这里的解决方案是使用手动分页(更复杂的)或重复距离定义两次:
$distance = "( 6371 * acos( cos( radians('{$CurrentIplat}') ) * cos( radians( ads.Latitude ) ) * cos( radians( ads.Longtitute ) - radians({$CurrentIplon}) ) + sin( radians({$CurrentIplat}) ) * sin( radians( ads.Latitude ) ) ) )";
if ($request->going){
if($request->lattitude && $request->longitude){
$CurrentIplat = $request->lattitude;
$CurrentIplon = $request->longitude;
$ads1 = DB::table('ads')
->leftJoin('categories', 'ads.category_id', '=', 'categories.id')
->select(
'ads.*','categories.category_name',
DB::raw($distance.' AS distance'))
->where('ads.domain',$this->domain)
->groupBy('ads.id')
->orderBy('distance')
->having(DB::raw($distance),'<','500')
->paginate(10);
}
}
因此,正如您在上面看到的那样,distance
列被提取到 $distance
变量,然后它被使用了两次 - 第一次在 select
中,第二次在 having