在laravel 5.2中,我有一个模型的分页表。
@CityController
public function index(Request $request){
$cities = City::orderBy('name');
return view('pages.city.index', ["cities" => $cities ->paginate(25)]);
}
这很好用,但是当我尝试在刀片视图中对结果进行排序时不起作用。
@ index.blade.php
<table>
<thead>
<tr class="sui-columnheader">
<th class="sui-headercell" data-field="Id">
<a href="{!! $cities->appends(['sort' => 'id'])->links() !!}">Id</a>
</th>
</thead>
<tbody class="list">
@foreach ($cities as $city)
<tr class="sui-row">
<td class="sui-cell id">{!! $city->id !!}</td>
</tr>
</tbody>
</table>
单击排序按钮时,只需重新加载页面,但不应用排序。
是因为“orderBy”条款? 如何使其工作并默认按名称排序? 我错过了什么吗?
答案 0 :(得分:2)
或许这样的事情。您可能希望确保限制传递给orderBy
的内容。像“...something?sort=blah
”这样的网址会导致您的表没有的orderBy('blah')
,这会导致数据库错误。
public function index(Request $request)
{
$cities = City::orderBy($request->input('sort', 'name'))->paginate(25);
return view('pages.city.index', ['cities' => $cities]);
}
{{ $cities->appends(Request::query())->render() }}
只是给你一个功能性的例子,但你必须根据自己的规则进行调整。
appends
只允许您根据当前排序继续进行分页,方法是通过分页链接的查询字符串传递排序选项。
<强>更新强>
使用您的示例,其中有一个默认值,但想象可以有不止一个其他字段进行排序:
$sort = trim($request->input('sort'));
// if it is in the acceptable array use it, otherwise default to 'name'
$sort = in_array($sort, ['id', ...]) ? $sort : 'name';
$cities = City::orderBy($sort)->paginate(25);
<table>
<tr>
<th><a href="{{ Request::fullUrlWithQuery(['sort' => 'id']) }}">ID</a></th>
<th><a href="{{ Request::url() }}">NAME</a></th>
...
</tr>
@foreach ($cities as $city)
<tr>
<td>{{ $city->id }}</td>
<td>{{ $city->name }}</td>
...
</tr>
@endforeach
...
{{ $cities->appends(Request::query())->render() }}
举个例子,你可以按照自己的意愿去做。