You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel项目URL显示名称而非ID,后台传递ID至控制器

解决Laravel中URL显示名称而非ID但后台获取ID的问题

没问题,我来帮你搞定这个需求。核心思路是让URL显示部门名称(或处理后的友好别名),然后在控制器中通过这个名称查询到对应的ID,再继续后续逻辑。下面分步骤说明:

1. 修改视图中的链接

首先把你当前视图里的链接从使用ID改成使用名称(如果后续用slug的话改成slug)。更推荐用Laravel的route助手,比直接拼接URL更灵活易维护。

原来的代码:

<a href="{{ url('/home_services_under_department/'.$data->id) }}"> {{$data->name}} </a>

修改后(直接用名称的版本):

<a href="{{ route('services.department', ['name' => $data->name]) }}"> {{$data->name}} </a>

更稳妥的slug版本(避免名称含空格/特殊字符问题):

<a href="{{ route('services.department', ['slug' => $data->slug]) }}"> {{$data->name}} </a>

2. 更新路由定义

把路由中的参数从{id}替换成{name}(或{slug}),同时给路由命名方便调用:

// routes/web.php
// 直接用name的版本
Route::get('/home_services_under_department/{name}', [YourController::class, 'showDepartmentServices'])->name('services.department');

// 用slug的推荐版本
Route::get('/home_services_under_department/{slug}', [YourController::class, 'showDepartmentServices'])->name('services.department');

3. 调整控制器方法逻辑

在对应的控制器方法中,通过传递过来的name/slug查询模型,从而获取到ID:

直接用name的情况:

public function showDepartmentServices($name)
{
    // 根据name查询对应的部门,找不到就返回404页面
    $department = \App\Models\Department::where('name', $name)->firstOrFail();
    
    // 现在你可以拿到$department->id,继续处理业务逻辑
    $services = $department->services; // 假设部门和服务已建立关联
    
    return view('department', compact('department', 'services'));
}

用slug的更稳妥版本:

如果部门名称可能重复,或者包含特殊字符,建议生成唯一的slug:

  1. 先给departments表添加slug字段(字符串类型,添加唯一索引)
  2. 在Department模型中自动生成slug:
// app/Models/Department.php
use Illuminate\Support\Str;

class Department extends Model
{
    // ... 其他模型代码

    protected static function boot()
    {
        parent::boot();
        
        // 创建部门时自动生成slug
        static::creating(function ($department) {
            $department->slug = Str::slug($department->name);
        });
        
        // 更新部门名称时同步更新slug
        static::updating(function ($department) {
            if ($department->isDirty('name')) {
                $department->slug = Str::slug($department->name);
            }
        });
    }
}

然后控制器方法改成:

public function showDepartmentServices($slug)
{
    $department = \App\Models\Department::where('slug', $slug)->firstOrFail();
    $services = $department->services;
    
    return view('department', compact('department', 'services'));
}

关键注意事项

  • 如果你直接用名称作为URL参数,必须保证部门名称是唯一的,否则多个同名部门会导致查询错误。
  • 用slug的方式更符合URL规范,也能避免名称重复、特殊字符的问题,是生产环境更推荐的方案。

内容的提问来源于stack exchange,提问作者raff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:26:21