我正在通过距离和搜索词进行搜索查询,但在雄辩中使用“拥有”时,标准分页不再有效。
这是我的代码:
$haversine = '( 3959 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) )';
$stores = Store::select(
DB::raw("*, $haversine AS distance"))
->having("distance", "<", $input['distance'])
->orderBy("distance")
->setBindings(array(
$latitude,
$longitude,
$latitude
))
->with(array(
'offers' => function($query) {
if(Input::has('term')) {
$query->whereHas('product', function ($product_query) {
$product_query->where(function($term_query) {
$fields = array('name', 'description','model_number');
foreach($fields as $field) {
$term_query->orWhere($field, 'LIKE', '%' . Input::get('term') . '%');
}
$term_query->orWhereHas('brand', function($brand_query) {
$brand_query->where('name', 'LIKE', '%' . Input::get('term') . '%');
});
});
});
}
$query->orderBy('price', 'ASC');
})
)
->get();
此查询在没有分页的情况下完美运行,但在尝试标准时
->paginat(10)
我得到以下内容:
SQLSTATE [42S22]:未找到列:1054'having子句'中的未知列'距离'(SQL:选择count(*)作为
stores
的聚合distance
<26.1817)< / p>
我已经做了很多寻找这个答案,但我不确定为什么我找到的解决方案对我不起作用。
我已经看过了: https://github.com/laravel/framework/issues/3105
和
How to use paginate() with a having() clause when column does not exist in table
如果你以前处理过这个问题,请给我一些指导。
修改
这是我尝试过的代码,但对我来说无法正常工作。
$current_page = Paginator::getCurrentPage();
$paginated_query = clone $stores;
$paginated_query->addSelect('stores.*');
$items = $paginated_query->forPage($current_page, 10)->get();
$totalResult = $stores->addSelect(DB::raw('count(*) as count'))->get();
$totalItems = $totalResult[0]->count;
$stores = Paginator::make($items->all(), $totalItems, 10);
答案 0 :(得分:-1)
在eloquent中使用'having'子句进行分页时遇到了同样的问题。
这对我有用:
使用实际计算,而不是在'having'子句中使用列的别名。
而不是:
$model->select(DB::raw("*, $haversine AS distance"))->having("distance", "<", $input['distance']);
试试这个:
$model->select("*")->having(DB:raw($haversine), "<", $input['distance']);