添加类别名称,而不是在Laravel ID在URL 4.2

问题描述:

我已经在我的控制器添加类别名称,而不是在Laravel ID在URL 4.2

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' => '[email protected]']); 

而且按钮

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

目前以下功能该网址看起来像 - http://example.com/category/1其中1是ID。我想显示名称。

我可以轻松地做类似

Route::get('/category/{categoryId}/{name}', ['uses' => '[email protected]']); 

按钮

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

但ID将仍然存在。我不能仅传递类别的名称,因为如果您检查上述查询,我​​需要该ID,因为我通过ID连接表。

任何想法我该怎么做?

Laravel 4.2版

你不需要$的categoryId的加入,因为你只在你那里语句中使用它。它有可能改变这一行:

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

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

你就不需要ID传递给showSubCats了,而且可以利用$类别名称替换它。

这只适用于类别名称是唯一的。否则,你仍然需要该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(
     '[email protected]', ['id' => $categoryId] 
    ); 
}); 
+0

感谢您的答案。那就是我要问的 - 如果名字不是唯一的,会发生什么?通常会..但是有可能有同名的类别或子类别。 – VLS

+0

其实,在你的查询中,我不确定它是否真的会成为问题,因为我不知道你的查询的结果是什么。你想显示一个类别的子类别? – piscator

+0

在这个函数中还有另一个小的查询,这与此无关,我已经删除它来缩短一些问题。底线是我需要通过ID。是的,我展示了仅分配给此类别的类别和产品的子类别。 – VLS