“我的索引”页面显示“我的图像”表中的所有图像,最新提交内容位于最上方。我正在尝试添加一些基本的过滤条件,以便我可以理解这个概念,但是我做错了什么。我的想法是:
向URL <a>
和www.domain.com
添加2个具有URL的www.domain.com/ascending
元素。如果用户转到www.domain.com
,则图像将以降序显示;如果用户转到www.domain.com/ascending
,则图像将以升序显示。
然后我将自己的本地路由Route::get('/', 'PagesController@index')->name('home');
设置为可选参数,例如Route::get('/{filter?}', 'PagesController@index')->name('home');
基于可选参数,我将向视图发送不同的$images
变量:
public function index($filter){
switch($filter) {
case 'ascending' : $images = Image::orderBy('created_at', 'asc')->get();break;
default : $images = Image::orderBy('created_at', 'desc')->get();
}
return view('home', ['images' => $images]);
}
这样做,到目前为止,我遇到了2个问题:
首先,当我去www.domain.com
时,我得到"Type error: Too few arguments to function App\Http\Controllers\PagesController::index(), 0 passed and exactly 1 expected"
第二,在将可选参数添加到路由Route::get('/{filter?}', 'PagesController@index')->name('home');
之后,即使我要访问http://example.com/admin
或http://example.com/albums
之类的URL,我也将发送到索引页面。
我相信这是因为我的代码假设/admin
和/albums
是我的http://example.com网址中的可选参数,而不是一个单独的网址。
Route::get('/{filter?}', 'PagesController@index')->name('home');
Route::get('/image/{id}', 'PagesController@specificImage')->name('specificImage');
Route::get('/tags', 'PagesController@tags')->name('tags');
因此,即使我转到标签路线,也会显示索引视图而不是标签视图。
如果有人能使我了解如何实现此基本过滤功能,我将不胜感激。
答案 0 :(得分:3)
您可以这样做 www.domain.com?orderby=asc
Route::get('/', 'PagesController@index')->name('home');
public function index(Request $request){
$images = array();
$images = Image::orderBy('created_at', $request->get('orderBy') ?? 'desc')->get();
return view('home', ['images' => $images]);
}
答案 1 :(得分:1)
我建议您在这种情况下使用get参数以避免url冲突。因此,对/
的请求
现在应该是
/?order=asc
或/?order=desc
而是切换get参数order
来知道是以降序还是升序显示页面。
答案 2 :(得分:0)
首先,在这种情况下,使用查询参数最适合进行过滤,而不是使用两个(或多个)URL端点。
但是,如果您想坚持自己的实施方式,则无事可做:
声明您的路线时不加斜杠,例如:
Route::get('{filter?}', 'PagesController@index')->name('home')
虽然不太确定这确实有什么区别,但是我个人很注意(到处都是斜线)
在路由声明后使用where()
,以限制值使用可选路径变量:
Route::get('{filter?}', 'PagesController@index')->name('home')->where('filter', 'ascending|');
它接受升序或不接受。
将默认参数传递给控制器方法:
public function index($filter = null)
{
.....
}
以防万一。这是使用可选路径变量要注意的重要点之一。
最后,通过在查询之前使用三元运算符,可以完全避免if
语句:
public function index($filter = null){
$order = $filter === 'ascending' ? 'asc' : 'desc';
$images = Image::orderBy('created_at', $order)->get();
return view('home', ['images' => $images]);
}