2013-09-05 74 views
1

我想在Laravel 4中使用相当复杂的查询分页(我认为使用Fluent查询生成器)。分页不工作在Laravel 4

查询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操作都使用相同的视图文件来显示搜索表单和结果。

请帮助,如果您需要更多信息,我很乐意编辑帖子并添加它,我在这里整夜!

回答

0

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

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

    return Redirect::to_action('[email protected]'); 
} 

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应该是差不多了。

+0

你在哪里编写'return Redirect :: to_action('controller @ viewResults');'你的意思是controller @ get_viewResults? 另外,如何在你的答案中提到使用GET? –

+0

我没有使用GET。我使用会话传递数据。使用GET时,您需要传递大量参数,因此在您的情况下可能不切实际。对于get_'混淆,抱歉,这是RESTful控制器的语法,你可以在这里阅读http://laravel.com/docs/controllers#restful-controllers。请记住,命名约定从3到4有一些差异。 –

3

我的建议是路由都viewResultssearch使用Route::any()所以同样的路线,你将需要两个动作执行单独的功能

routes.php文件

Route::any('/list','[email protected]');

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)); 
} 

所以不管你执行POSTGET您将执行同样的动作,仍然能够进行搜索,并获得满意的结果。我希望这可以帮助

+1

应该选择此答案作为特色! – jOpacic