使用slugs的ID和用户名(路由模型绑定)

时间:2018-01-22 02:52:31

标签: laravel laravel-5 laravel-5.5

因此,默认情况下,我不需要用户在注册时创建用户名。所以他们的用户名不会被设置,而是他们的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';
}

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

where username = ?

由于路由模型绑定的工作方式和加载顺序,我无法使用if语句检查其用户名是否存在,因为,laravel如何知道获取ID或用户名。

如果没有创建拉取请求,有没有办法解决这个问题?你们有没有经历过这样的事情?

1 个答案:

答案 0 :(得分:1)

如果滚动浏览文档中的getRouteKeyName部分,则会找到有关自定义分辨率逻辑的部分。 https://laravel.com/docs/5.5/routing#explicit-binding

这允许您指定运行查询模型的查询。 E.g。

// 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();
    });
}