Laravel Eloquent - hasrsine 公式和分页

Posted

技术标签:

【中文标题】Laravel Eloquent - hasrsine 公式和分页【英文标题】:Laravel Eloquent - haversine formula and pagination 【发布时间】:2017-07-24 06:15:37 【问题描述】:

代码审查

我在Code Review 分支上创建了一个主题。

问题

我正在使用半正弦公式来计算从所选邮政编码到所需目的地的距离。

App\Models\Business.php

public function scopeDistance($query, $latitude, $longitude, $radius)

    $query->getQuery()->orders = [];
    return $query->select('*')
                 ->selectRaw("( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) )  * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin(radians(latitude)) ) ) AS distance")
                 ->having('distance', '<=', $radius)
                 ->orderBy('distance');

一切似乎都很好,除了我使用paginate() 方法而不是get()

我一直在寻找解决方案,有很多主题描述了这个问题,但似乎人们没有提出好的解决方案。

在我的案例中,一些解决方案导致了不正确的值。 也许我做错了什么 - 不确定...

但是我想出了这个解决方案,如果它在性能和内存使用方面还可以,我想听听任何反馈。

function custom_paginator($builder, $per_page)

    $path = current_route();
    $current_page = \Illuminate\Pagination\Paginator::resolveCurrentPage();

    if ( ! isset($builder->getQuery()->columns[1])) $count = $builder->count();
    else
    
        $query = clone $builder->getQuery();
        $query->columns = [ $query->columns[1] ];
        $query->orders = null;
        $count = array_get(\DB::select("select count(*) as count from ($query->toSql()) as haversine", $query->getBindings()), 0)->count;
    

    return new \Illuminate\Pagination\LengthAwarePaginator(
        $builder->forPage($current_page, $per_page)->get(),
        $count, $per_page, null, compact('path')
    );

我没有更多的想法如何改进它,至少它有效,我不需要调用类似的东西

count = count($results = $builder->get());
$items = $results->forPage($curPage, $perPage);

非常感谢您的反馈。

【问题讨论】:

【参考方案1】:

您真的需要创建自定义分页器吗?

如果不尝试使用默认值。

我不喜欢的另一件事是原始查询,您使用的是 laravel,所以尽可能多地利用。

您需要展示您的控制器操作以获得更多反馈。

说实话,*** 并不是这个问题的最佳答案, 代码审查堆栈交换我会更合适,因为您的代码已经可以工作并且您只想改进它

【讨论】:

您可能是对的,我从未使用过“代码审查堆栈交换”,感谢您告诉我。我确实需要使用自定义分页,因为 paginate() 方法不适用于 having 关键字。 SQL 内部有动态的distance 变量,在使用 Laravel 的默认分页器时看不到。这是一个很常见的错误——我并不孤单。 (SQLSTATE[42S22]: Column not found: 1054 Unknown column 'distance' in 'having clause') 好的,我明白了,那么这是您自定义的正当理由,因为您别无选择,只需再重构您的代码,也可能不需要子查询来获得计数

以上是关于Laravel Eloquent - hasrsine 公式和分页的主要内容,如果未能解决你的问题,请参考以下文章

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php [Eloquent CheatSheet] Eloquent #laravel #eloquent的常见查询方法

Laravel - Eloquent 连接

Laravel 从 Raw DB 到 Eloquent

Laravel/Eloquent 建议覆盖 trait 属性?

创建动态的 Eloquent 类 laravel