我有这样的代码:
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;
}
}
唯一的问题是它从不运行$ providerName ==“facebookprovider”等检查并更新该用户的令牌。为什么会发生这种情况有什么特别的原因吗?
答案 0 :(得分:0)
在documentation上找到:
如果您只需要从数据库表中检索单行,那么 可以使用第一种方法。此方法将返回单个 StdClass 的对象强>
第一次调用first()
时会得到stdClass对象。第二个可能永远不会是真的,因为这个类没有这个方法。
如果您按if ($user->first())
更改if ($user)
,则可能会有效。