0

I have a code like this:

public function createOrGetUser(Provider $provider)
{
    $providerUser = $provider->user();
    $providerName = class_basename($provider);
    $token = $providerUser->token;
    $account = SocialAccount::whereProvider($providerName)
        ->whereProviderUserId($providerUser->getId())
        ->first();
    if ($account) {
        return $account->user;
    }else{
        $account = new SocialAccount([
            'provider_user_id' => $providerUser->getId(),
            'provider' => $providerName
        ]);
        $user = User::whereEmail($providerUser->getEmail())->first();
        if($user->first()) {
        if($providerName == "FacebookProvider") {
            $user->facebook_token = $token;
        }elseif($providerName == "TwitterProvider") {
            $user->twitter_token = $token;
        }else{
            $user->google_token = $token;
            }
        $user->save();
        }
        if (!$user) {
            $user = User::create([
                'email' => $providerUser->getEmail(),
                'name' => $providerUser->getName(),
                'avatar' => $providerUser->getAvatar(),
            ]);
        }
        $account->user()->associate($user);
        $account->save();
        return $user;
    }
}

The only problem with that is it never runs the check for $providerName == "facebookprovider" etc and update the token for that user. Is there any particular reason for why this is happening?

Przemek Wojtas
  • 1,311
  • 5
  • 26
  • 51

1 Answers1

0

Found on the documentation:

If you just need to retrieve a single row from the database table, you may use the first method. This method will return a single StdClass object

You get stdClass object when you called first() the first time. The second one will probably never be true, because this class has not this method.

It could work if you change if ($user->first()) by if ($user).

Kévin Bibollet
  • 3,573
  • 1
  • 15
  • 33