[英]Multi provider relational user table in laravel
我是 laravel 的新手,并试图创建一个身份验证系统,用户可以在其中使用多个提供程序登录/注册,并且每当用户使用任何提供程序登录时,必须相应地显示用户头像和个人资料数据。 使用Auth::user()->providers
,结果是该用户的所有注册提供程序的数组。
我想要的是仅获取当前登录方法的提供者数据(即本地帐户、Facebook 帐户提供者、谷歌帐户提供者等),以便我可以为用户显示来自该确切提供者的数据。
用户名
...
public function providers()
{
return $this->hasMany("App\UserProvider");
}
...
用户提供者.php
class UserProvider Extends Model
{
protected $table = 'user_providers';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'user_id', 'provider', 'provider_id','avatar_url', 'token', 'token_secret',
];
}
请让我知道我是否走在正确的道路上,或者还有其他方法可以做到这一点。 谢谢!
您可以使用您的关系来构建查询
$provider = Auth::user()->providers()->where('provider', 'facebook')->first();
这将返回单个 UserProvider 类对象
您还可以在user_providers
表中包含一个布尔列,以了解最后使用哪个提供程序(因此这将是当前登录方法)。 我们将此列is_current
。
因此,当用户访问系统时,您更新登录方法,将此字段设置为true
。 你可以通过覆盖app\\Http\\Controllers\\LoginController
控制器的authenticated()
方法来做到这一点:
# app\Http\Controllers\LoginController.php
protected function authenticated(Request $request, $user)
{
Auth::user()
->providers()
->where('provider', $request->provider) // Change this to make it work
->update('is_current', true);
}
这样,您可以随时随地访问当前的登录方法,执行以下操作:
Auth::user()->providers()->whereTrue('is_current')->first();
当然,你可以在你的模型中创建一个访问器来缩短它:
# User.php
public function getCurrentProviderAttribute()
{
return $this->providers()->where('is_current', true)->first();
}
所以现在,你可以简单地做:
Auth::user()->current_provider;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.