1

我正在尝试在 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  

我在控制器中的查询生成器末尾调用分页,如下所示:

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

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

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

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

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

4

2 回答 2

4

我的建议是将两者路由viewResultssearch同一路由,Route::any()这样您就需要为这两个操作执行单独的功能

路由.php

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

控制器.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));
}

因此,无论您执行 aPOST还是GET执行相同的操作,仍然能够执行搜索并获得结果。我希望这有帮助

于 2013-09-06T03:31:12.657 回答
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 应该几乎相同。

于 2013-09-05T17:28:00.403 回答