在Laravel 4.2中的url中添加类别名称而不是id

时间:2017-03-27 11:48:55

标签: php laravel laravel-4

我的控制器中有以下功能

public function showSubCats($categoryId) {

   $subcats = DB::table('sub_category as sc')
    ->leftJoin('products as p', 'p.sub_cat_id', '=', 'sc.sub_cat_id')
    ->where('sc.category_id', '=', $categoryId)
    ->whereNotNull('p.sub_cat_id')
    ->select('p.*','sc.*', DB::raw('sc.sub_cat_id AS sub_cat_id'))
    ->groupBy('sc.sub_cat_id')
    ->get();

     return View::make('site.subcategory', [            
          'subcats' => $subcats

     ]); 
}

这在路由器中

Route::get('/category/{categoryId}', ['uses' => 'CategoryProducts@showSubCats']);

按钮

<a href="{{ URL::to( '/category/' .  $category->category_id) }}">View More</a>

目前,网址看起来像是http://example.com/category/1,其中1是ID。我想改为显示这个名字。

我很容易就能做出像

这样的事情
Route::get('/category/{categoryId}/{name}', ['uses' => 'CategoryProducts@showSubCats']);

按钮

<a href="{{ URL::to( '/category/' .  $category->category_id.'/'.$category->category_name) }}">View More</a>

但身份证仍将存在。我也不能只传递类别的名称,因为如果你检查上面的查询我需要ID,因为我通过ID连接表。

知道我该怎么办?

Laravel版本4.2

1 个答案:

答案 0 :(得分:1)

您不需要$ categoryId进行加入,因为您只在where语句中使用它。可以更改此行:

->where('sc.category_id', '=', $categoryId)

进入

 ->where('sc.category_name', '=', $categoryName)

您不再需要将ID传递给showSubCats,并且可以将其替换为$ categoryName。

仅当类别名称是唯一的时才有效。否则你仍然需要id。

在这种情况下,您可以使用路径中的查询隐藏id,该查询根据名称获取子类别的id。尝试这样的事情:

Route::get('/category/{categoryName}', function($categoryName) {

    $categoryId = DB::select('select id from sub_category where name = ?', array($categoryName))[0]->id;

    return redirect()->action(
         'CategoryProducts@showSubCat', ['id' => $categoryId]
    );
});