Php 分页在Laravel 4中不起作用

Php 分页在Laravel 4中不起作用,php,mysql,pagination,laravel,laravel-4,Php,Mysql,Pagination,Laravel,Laravel 4,我试图在Laravel4中使用分页来处理相当复杂的查询(我想是使用Fluent查询生成器) 查询SQL代码 SELECT `description`, `email`, `website`, `telephone`, `purpose`, `services`, `eligibilitycriteria`, `meetingplace`, `servicecosts`, `area`, `servicetype`, `beneficiarytype`,

我试图在Laravel4中使用分页来处理相当复杂的查询(我想是使用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  
我在我的控制器中调用查询生成器末尾的分页,如下所示:

$results = $query->paginate(20);
然后在我看来,我只需调用
$results->links
,就可以得到下一页的分页按钮和编号页等

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

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


请帮助,如果你需要更多的信息,我很乐意编辑这篇文章并添加进去,我整晚都在这里

您必须在会话中使用GET或store查询,我看不到更简单的方法。 不管怎么说,像你这样使用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应该几乎相同。

您必须在会话中使用获取或存储查询,我看不到更简单的方法。 不管怎么说,像你这样使用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应该几乎相同。

我的建议是使用
route::any()
viewResults
search
路由到相同的路由,这样您就需要为这两个操作执行不同的功能

routes.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));
}
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
操作,您都将执行相同的操作,并且仍然能够执行搜索并获取结果。我希望这有帮助

我的建议是使用
route::any()
查看结果
搜索
路由到同一个路由,这样您就需要为这两个操作执行单独的功能

routes.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));
}
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
操作,您都将执行相同的操作,并且仍然能够执行搜索并获取结果。我希望这对您编写的
return Redirect::to_action('controller@viewResults');return Redirect::to_action('controller@viewResults');