分页在Laravel 4中不起作用

时间:2013-09-05 16:43:49

标签: php mysql pagination laravel laravel-4

我试图在Laravel 4中使用相当复杂的查询分页(我认为使用Fluent查询构建器)。

查询SQL代码

SELECT `description`, `email`, `website`, `telephone`, `purpose`, `services`,      
       `eligibilitycriteria`, `meetingplace`, `servicecosts`, `area`, 
       `servicetype`, `beneficiarytype`, `charitynumber`, `address`, `contacts`, 
MATCH (
       `name`,`description`,`email`,`website`,`telephone`,`purpose`,`services`,
       `eligibilitycriteria`,`meetingplace`,`servicecosts`,`area`,`servicetype`,
       `beneficiarytype`,`charitynumber`,`address`,`contacts`
      ) 
AGAINST ("dan") AS Score0, 
MATCH (`name`) AGAINST ("dan") AS Score1 FROM `directory_cache`   
WHERE MATCH(
       `description`,`email`,`website`,`telephone`,`purpose`,`services`,
       `eligibilitycriteria`,`meetingplace`,`servicecosts`,`area`,`servicetype`,
       `beneficiarytype`,`charitynumber`,`address`,`contacts`
      ) 
AGAINST ("dan") 
ORDER BY (Score0*1 + Score1*1.5) DESC  

我在控制器的查询构建器末尾调用paginate,如下所示:

$results = $query->paginate(20);

然后在我看来,我只是致电$results->links,我确实得到了下一页和编号页面的分页按钮等。

但是当我点击第2页时,这就是我遇到问题的地方。

我的表单使用POST提交搜索表单。 get和post操作都使用相同的视图文件来显示搜索表单和结果。

请提供帮助,如果您需要更多信息,我很乐意编辑帖子并将其添加进去,我在这里过夜!

2 个答案:

答案 0 :(得分:3)

我的建议是使用viewResultssearchRoute::any()路由到同一路线,这样您就需要为这两项操作执行单独的功能

<强> routes.php文件

Route::any('/list','Controller@viewResults');

<强> Controller.php这样

function viewResults(){

    $searchQuery = Input::get('searchQuery');
    if(isset($searchQuery))
       $query = DirectoryCache::where(...)->where(...);
    else
       $query = DirectoryCache::where(1, '=', 1);

    $results = $query->paginate();

    //This will append the searchQuery to your pagination links
    $results->appends(array('searchQuery'=>$searchQuery));
}

因此无论您执行POST还是GET,您都会执行相同的操作,但仍然可以执行搜索并获得结果。我希望这有帮助

答案 1 :(得分:0)

你必须使用GET或在会话中存储查询,我没有看到更简单的方法。 像你一样使用POST无论如何都是不好的做法。你应该发布POST,然后从那里重定向,要么传递GET参数,要么保持查询在会话中。

function post_search() {
    $query = DirectoryCache::where(...)->where(...);
    Session::put('searchQuery', $query);

    return Redirect::to_action('controller@viewResults');
}

function get_viewResults($page = 1) {
    $perPage = 20;

    $query = Session::get('searchQuery', DirectoryCache::where(1, '=', 1));
    $query = $query->paginate();
    $query->skip($page * $perPage)->take($perPage);

    $results = $query->get(); 
    ...
}

我知道它是Laravel 3,我还没有触及4,但API应该几乎相同。