Я делаю поисковый запрос по расстоянию и поисковому запросу, но при использовании «Имея» в eloquent стандартная нумерация страниц больше не работает.
Вот мой код:
$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 Неизвестный столбец «расстояние» в «имеющем предложении» (SQL: выберите количество (*) в качестве агрегата из
stores
имеющийdistance
< 26,1817)
Я много раз искал этот ответ, но я не уверен, почему найденные мной решения не работают для меня.
Я уже посмотрел на:
https://github.com/laravel/framework/issues/3105
а также
Как использовать paginate () с предложением has (), когда столбца в таблице нет
Пожалуйста, дайте мне несколько советов, если вы уже сталкивались с этой проблемой в прошлом.
Редактировать:
Вот код, который я пробовал, но у меня не получилось.
$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);
У меня была такая же проблема с нумерацией страниц с использованием предложения «Имея» в eloquent.
Это сработало для меня:
Вместо использования псевдонима столбца в предложении «using» используйте фактический расчет.
Вместо:
$model->select(DB::raw("*, $haversine AS distance"))->having("distance", "<", $input['distance']);
Попробуй это:
$model->select("*")->having(DB:raw($haversine), "<", $input['distance']);
Других решений пока нет …