我试图在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操作都使用相同的视图文件来显示搜索表单和结果。
请提供帮助,如果您需要更多信息,我很乐意编辑帖子并将其添加进去,我在这里过夜!
答案 0 :(得分:3)
我的建议是使用viewResults
将search
和Route::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应该几乎相同。