对 slug 使用 ID 和用户名(路由模型绑定)



所以默认情况下,我不要求用户在注册时创建用户名。因此,不会设置他们的用户名,而是他们的 UID 将是他们的 ID,而不是像这样这样的用户名:

/**
 * Get the Username
 */
public function getUsernameAttribute()
{
    if($this->attributes['username']){
        return $this->attributes['username'];
    }
    return $this->id;
}

因此,每当他们访问具有路由模型绑定的 URL 时,它都会获取他们的信息(ID(

但是现在假设我也想为路线模型出价使用用户名,以防他们更新并设置用户名,我可以这样做:

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'username';
}

这适用于用户名。现在我的问题是,它不再适用于那些没有用户名 (id( 的人,而是在寻找用户名:

where username = ?

由于路由模型绑定的工作方式和加载顺序,我无法执行 if 语句来检查它们的用户名是否存在,因为,好吧,laravel怎么知道获取 ID 或用户名。

有没有办法在不创建拉取请求的情况下解决这个问题?你们中有人经历过这样的事情吗?

如果您滚动到文档中的getRouteKeyName部分,您将找到有关自定义解析逻辑的部分。https://laravel.com/docs/5.5/routing#explicit-binding

这允许您指定为查找模型而运行的查询。 例如

// RouteServiceProvider.php
public function boot()
{
    parent::boot();
    Route::bind('user', function ($value) {
        return User::where(function ($query) use ($value) {
                return $query->where('id', $value)->orWhere('username', $value);
            })
            ->firstOrFail();
    });
}

最新更新