laravel 中的多提供者关系用户表
Posted
技术标签:
【中文标题】laravel 中的多提供者关系用户表【英文标题】:Multi provider relational user table in laravel 【发布时间】:2020-06-03 00:14:00 【问题描述】:我是 laravel 的新手,正在尝试创建一个身份验证系统,用户可以在其中使用多个提供商登录/注册,并且每当用户使用任何提供商登录时,都必须相应地显示用户头像和个人资料数据。当使用Auth::user()->providers
时,结果是该用户的所有注册提供者的数组。
我想要的是仅获取当前登录方法的提供者数据(即本地帐户、Facebook 帐户提供者、谷歌帐户提供者等),以便我可以为用户显示来自该确切提供者的数据。
用户.php
...
public function providers()
return $this->hasMany("App\UserProvider");
...
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',
];
请让我知道我的方法是否正确或是否有其他方法可以做到这一点。 谢谢!
【问题讨论】:
【参考方案1】:您可以使用您的关系来构建查询
$provider = Auth::user()->providers()->where('provider', 'facebook')->first();
这将返回单个 UserProvider 类对象
【讨论】:
【参考方案2】:您还可以在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;
【讨论】:
这是一个很好的解决方案。现在我更喜欢 Ruben 的修补程序,因为它更简单。谢谢各位以上是关于laravel 中的多提供者关系用户表的主要内容,如果未能解决你的问题,请参考以下文章