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