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 中的多提供者关系用户表的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Laravel 中的多对多关系获取模型

Laravel 4:具有额外关系的多对多

在 Laravel 中查询用户的多对多关系

Laravel 8:在空的多对多关系中使用枢轴时出错

Laravel eloquent 检查不存在的多对多关系

从 Laravel 中的多对多关系获取列值