【问题标题】:Laravel 4.2 Pagination with complex DB queryLaravel 4.2 复杂数据库查询的分页
【发布时间】:2015-01-05 19:47:39
【问题描述】:

我是 Laravel 4.2 的新手。

我需要在我的视图搜索结果页面中做一些分页。

我正在做的是在控制器中编写这段代码 -

public function getSpecials()
{
    $title = "Specials";

    
    $info = DB::table(DB::raw('`car` , `available_car`, `users`'))
                        ->select('car.car_maker', 'car.car_model', 'available_car.car_price', 'car.car_production_year', 'available_car.car_id', 'available_car.id', 'available_car.current_position')
                        ->where('available_car.car_id', '`car`.`car_id`')
                        ->where('available_car.is_sold', 'no')
                        ->whereRaw('`available_car`.`created_at` BETWEEN NOW() - INTERVAL 30 DAY AND NOW()')
                        ->orderByRaw('WEEK(`available_car`.`created_at`) DESC')
                        ->orderBy('available_car.car_price', 'desc')
                        ->orderBy('users.last_paid_date', 'desc')
                        ->orderBy('available_car.created_at', 'desc')
                        ->distinct()
                        ->get();

    $pagination = Paginator::make($info, count($info), 5);


    //var_dump($pagination );
    
    
    return View::make('specials',compact('pagination'))->with('info',$info)->with('title',$title);
}

我想每页显示 5 个项目。所以我正在做这样的分页 -

$pagination = Paginator::make($info, count($info), 5);

但这里的问题是我在页面中完美地获得了分页编号。 但是,所有页面都显示了整个结果,而不是只显示 5 个项目。

这是输出。 (分页是每页 5 个项目,在我的情况下,总条目数是 7)

第 1 页

第 2 页

谁能帮帮我? 提前感谢您的帮助。

【问题讨论】:

  • 您使用的是什么网络服务器?你能告诉我们你是如何使用 url rewrite 的吗?
  • 而不是get(),使用paginate(5)。您有一个直接查询构建器对象。你可以链接它。如果你想走自定义方式,你必须再次添加 skiptake 并从页面参数计算它们。
  • 我正在使用 WAMP 服务器。如果我使用 paginate() 什么都没有显示,我需要更改 WAMP 服务器中的任何设置吗?我们没有使用任何 URL 重写......我们只使用默认的 laravel 分页
  • 我在视图中使用分页,例如 {{ $pagination->links() }}

标签: php mysql laravel pdo pagination


【解决方案1】:

只需对代码稍作改动,laravel 会处理其余的。

public function getSpecials()
{
    $title = "Specials";


    $info = DB::table(DB::raw('`car` , `available_car`, `users`'))
                        ->select('car.car_maker', 'car.car_model', 'available_car.car_price', 'car.car_production_year', 'available_car.car_id', 'available_car.id', 'available_car.current_position')
                        ->where('available_car.car_id', '`car`.`car_id`')
                        ->where('available_car.is_sold', 'no')
                        ->whereRaw('`available_car`.`created_at` BETWEEN NOW() - INTERVAL 30 DAY AND NOW()')
                        ->orderByRaw('WEEK(`available_car`.`created_at`) DESC')
                        ->orderBy('available_car.car_price', 'desc')
                        ->orderBy('users.last_paid_date', 'desc')
                        ->orderBy('available_car.created_at', 'desc')
                        ->distinct()
                        ->paginate(5);

return View::make('specials',['info' => $info, 'title' => $title]);
}

视图中

像这样迭代:

@if(!$info->isEmpty())

    @foreach($info as $i)
    do whatever you want
    @endforeach

@else
   no data to show....

@endif

{{$info->links()}}

【讨论】:

  • 非常感谢您的解决方案。但问题并没有完美解决。如果我 ver_dump 查询结果,一切正常。但是如果我只是在视图中发送它,那么它不会加载任何东西。它只是一次又一次地加载和加载,但没有显示任何内容。你能帮帮我吗?
  • 你不应该 var dump 一个 paagination 对象......它会耗尽内存。如果你想得到这些物品,你可以做$info->getItems(),它会给你返回结果。并显示您的视图文件。
  • 谢谢。我在尝试。感谢您的帮助。为这个答案投票
【解决方案2】:

您需要手动创建分页器(查看question 了解更多详情):

$pageNumber = Input::get('page', 1);
$perPage = 5;

$info = DB::table(DB::raw('`car` , `available_car`, `users`'))
                    ->select('car.car_maker', 'car.car_model', 'available_car.car_price', 'car.car_production_year', 'available_car.car_id', 'available_car.id', 'available_car.current_position')
                    ->where('available_car.car_id', '`car`.`car_id`')
                    ->where('available_car.is_sold', 'no')
                    ->whereRaw('`available_car`.`created_at` BETWEEN NOW() - INTERVAL 30 DAY AND NOW()')
                    ->orderByRaw('WEEK(`available_car`.`created_at`) DESC')
                    ->orderBy('available_car.car_price', 'desc')
                    ->orderBy('users.last_paid_date', 'desc')
                    ->orderBy('available_car.created_at', 'desc')
                    ->distinct()
                    ->get();

$slice = array_slice($info, $perpage * ($pageNumber - 1), $perpage);
$info = Paginator::make($slice, count($info), $perPage);
return View::make('specials',['info' => $info, 'title' => $title]);

然后像@itachi 建议的那样在 foreach 循环中打印结果。

【讨论】:

  • 谢谢。这是我需要的答案,因为我使用的是返回数组的 DB::select()。
猜你喜欢
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2013-08-05
  • 2017-05-10
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多