【问题标题】:Adding category name instead of id in url in Laravel 4.2在 Laravel 4.2 的 url 中添加类别名称而不是 id
【发布时间】:2017-08-20 02:41:36
【问题描述】:

我的控制器中有以下功能

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 加入表。

知道我该怎么做吗?

Laravel 4.2 版

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案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]
        );
    });
    

    【讨论】:

    • 感谢您的回答。这就是我要问的 - 如果名称不是唯一的会发生什么?通常会是 .. 但有可能具有相同名称的类别或子类别。
    • 实际上,在您的查询中,我不确定这是否真的会成为问题,因为我不知道您的查询所需的结果是什么。是否要显示某个类别的子类别?
    • 此函数中还有另一个与此无关的小查询,我已将其删除以缩短一点问题。底线是我需要传递 ID。是的,我还展示了仅分配给该类别的类别和产品的子类别。
    • 由于您过滤了联接中的子类别,我预计您不会遇到重复问题。但是你必须运行一些测试,因为我现在不知道你的数据模型是什么。您还可以考虑使用 Eloquent 代替 DB 类和原始查询。它将使您能够显示子类别(产品和类别)的关系。过滤掉某个产品等。
    • 有没有办法不将名称作为参数传递,但仍然可以在 url 中获取?
    猜你喜欢
    • 2011-09-04
    • 2015-02-16
    • 1970-01-01
    • 2019-10-07
    • 2015-03-06
    • 1970-01-01
    • 2021-08-26
    • 2020-09-15
    • 2021-12-27
    相关资源
    最近更新 更多