如何用hasrsine公式分析Eloquent查询

时间:2015-03-06 18:58:07

标签: php laravel pagination eloquent laravel-pagination

我正在通过距离和搜索词进行搜索查询,但在雄辩中使用“拥有”时,标准分页不再有效。

这是我的代码:

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

1 个答案:

答案 0 :(得分:-1)

在eloquent中使用'having'子句进行分页时遇到了同样的问题。

这对我有用:

使用实际计算,而不是在'having'子句中使用列的别名。

而不是:

$model->select(DB::raw("*, $haversine AS distance"))->having("distance", "<", $input['distance']);

试试这个:

$model->select("*")->having(DB:raw($haversine), "<", $input['distance']);