>我的控制器中有以下功能
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>
目前 url 看起来像 - 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,因为我通过 ID 连接表。
知道我该怎么做吗?
拉拉维尔4.2版
连接不需要$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]
);
});