2013-09-05 40 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