【问题标题】:How to use raw sql Pagination in Laravel5?如何在 Laravel5 中使用原始 sql 分页?
【发布时间】:2015-07-10 04:36:53
【问题描述】:

这是我的控制器代码:

$sql = "SELECT *,earth_distance(ll_to_earth(team.lat, team.lng), ll_to_earth(23.1215939329,113.3096030895)) AS distance FROM team where earth_box(ll_to_earth(23.1215939329,113.3096030895),1000) @> ll_to_earth(team.lat, team.lng); ";
$result = DB::select( \DB::raw( $sql ) );

如何在这段代码中添加分页来构建我的 restful api?

iOS或者android都会发送“next page”参数,如何使用和查找下一节数据?

【问题讨论】:

    标签: php laravel laravel-5 pagination


    【解决方案1】:

    据我所知,您无法对原始查询进行分页,原因如下:

    $result = DB::select($sql); 
    

    $result 这里将有数组类型,paginate() 是来自Illuminate\Database\Query\Builder 类的方法。

    您的案例可以这样处理:

    $items = DB::table('team')   
        ->selectRaw('SELECT *,earth_distance(ll_to_earth(team.lat, team.lng), ll_to_earth(23.1215939329,113.3096030895)) AS distance')
        ->whereRaw('earth_box(ll_to_earth(23.1215939329,113.3096030895),1000) @> ll_to_earth(team.lat, team.lng)')
        ->paginate(10);
    
    foreach($items as $item) {
        echo $item->distance;
    }
    

    如您所见,将原始查询与selectRaw()whereRaw() 方法分开只需很少的工作。

    【讨论】:

    • @Kenny 如果有帮助,您可以接受我的回答以供更多读者使用 :)
    【解决方案2】:

    如果您尝试对动态列进行分页,而您可能正在处理用于报告的计算,则另一个选择是创建一个排序方法并传入您的数组和参数:

    public function sort($array_of_objects, $sort_by=null, $order, $page) 
    {
        $collection = collect($array_of_objects);
        if ($sort_by)
        {
    
            if ($order=='desc') {
                $sorted = $collection->sortBy(function($role) use ($sort_by)
                {
                    return $role->{$sort_by};
                })->reverse();
            } else if ($order=='asc') {
                $sorted = $collection->sortBy(function($role) use ($sort_by)
                {
                    return $role->{$sort_by};
                });
            }
        } else {
            $sorted = $collection;
        }
    
        $num_per_page = 20;
        if (!$page) {
            $page = 1;
        }
    
        $offset = ( $page - 1) * $num_per_page;
        $sorted = $sorted->splice($offset, $num_per_page);
    
        return  new Paginator($sorted, count($array_of_objects), $num_per_page, $page);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 2016-01-28
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      相关资源
      最近更新 更多