我在使用Laravel创建一些基本过滤时遇到问题

时间:2018-08-13 16:00:51

标签: php laravel laravel-5

“我的索引”页面显示“我的图像”表中的所有图像,最新提交内容位于最上方。我正在尝试添加一些基本的过滤条件,以便我可以理解这个概念,但是我做错了什么。我的想法是:

向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/adminhttp://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');

因此,即使我转到标签路线,也会显示索引视图而不是标签视图。

如果有人能使我了解如何实现此基本过滤功能,我将不胜感激。

3 个答案:

答案 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端点。

但是,如果您想坚持自己的实施方式,则无事可做:

  1. 声明您的路线时不加斜杠,例如:

      Route::get('{filter?}', 'PagesController@index')->name('home') 
    

    虽然不太确定这确实有什么区别,但是我个人很注意(到处都是斜线)

  2. 在路由声明后使用where(),以限制值使用可选路径变量:

    Route::get('{filter?}', 'PagesController@index')->name('home')->where('filter', 'ascending|');
    

    它接受升序或不接受。

  3. 将默认参数传递给控制器​​方法:

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