我的控制器中有以下功能
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
答案 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]
);
});