Есть ли способ аутентифицировать пользователя из двух столбцов, которые находятся в отдельной таблице, используя laravel? - PullRequest
1 голос
/ 09 октября 2019

У меня есть поток, в котором я аутентифицирую пользователя на основе предоставленных email и provider_id (для входа в социальную сеть). Прямо сейчас у меня есть столбец provider_id в той же таблице users. Следующий скрипт работает нормально для аутентификации пользователя.

$loginAttempt = User::where([
    ['provider_id', '=', $request->provider_id],
    ['email', '=', $request->email]
])->first();
if($loginAttempt !== null){
    Auth::login($loginAttempt);
    if (!Auth::check()){
        ...
    }else{
        ...
    }
}

Но таким образом я не могу сохранить несколько социальных логинов для пользователя. Я собираюсь разделить на две таблицы. Второй - social_login, в котором я добавил два столбца user_id и provider_id.

Теперь я хочу аутентифицировать пользователя на основе email и provider_id, но теперь они находятся в двух разных таблицах,Я попробовал тот же скрипт с небольшими изменениями, но он не работает.

Может ли кто-нибудь помочь мне с этим, как я могу это сделать. Я был бы очень признателен.

Большое спасибо.

1 Ответ

0 голосов
/ 09 октября 2019

Я предполагаю, что вы имеете в виду, что provider_id теперь находится в вашей таблице social_login, а user_id в вашей таблице social_login имеет отношение hasMany() с идентификатором пользователя в вашей пользовательской таблице (то есть пользователь можетесть несколько провайдеров)? В этом случае вы можете сделать что-то вроде этого:

$user = User::where(['email', $request->email])->first();  //check if the email exists
if(!$user){  //return error if not
    return back()->withError('Email is invalid.');
}
//lookup the provider_id for the user
$loginAttempt = $user->provider_ids->where(['provider_id', $request->provider_id])->first();  
if($loginAttempt){
    Auth::login($loginAttempt);
    if (!Auth::check()){
        ...
    }else{
        ...
    }
}

РЕДАКТИРОВАТЬ:

Для ясности, ваша модель пользователя будет иметь следующую функцию:

public function provider_ids()
  {
    return $this->hasMany('App\ProviderID');
  }

А ваша таблица social_login может выглядеть примерно так:

public function up()
{
  Schema::create('social_login', function(Blueprint $table)
  {
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');
    $table->string('provider_id');
    $table->timestamps();
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...