我不确定这是否真的导致了我的问题,但也许有人会知道。当我使用Laravel Socialite并去:
$social_user = Socialite::driver($provider)->user();
然后在我的代码中的其他地方执行此操作:
if ($authUser = User::where('provider_id', $social_user->id))
return $authUser;
出于某种疯狂的原因,我得到了这样的错误:
传递给Illuminate \ Auth \ SessionGuard :: login()的参数1必须实现接口Illuminate \ Contracts \ Auth \ Authenticatable,Illuminate \ Database \ Eloquent \ Builder的实例
但是,如果我这样做,我不会收到错误:
if($authUser = User::where('email', $social_user->email)->first())
return $authUser;
我按照以下方式记录此用户:
Auth::login($authUser, true);
有谁知道为什么?我正在使用laravel 5.2
答案 0 :(得分:1)
错误消息实际上是自我解释的。当您执行User::where('provider_id', $social_user->id)
时,您最终会使用实施Illuminate\Database\Eloquent\Builder
的构建器对象。您可以在其上调用->get()
以获取结果集合(在您的案例中实现Illuminate\Contracts\Auth\Authenticatable
的对象集合,以便您可以迭代它们),或者当您是的,您可以使用->first()
(一个实现Illuminate\Contracts\Auth\Authenticatable
的对象)获得第一次匹配。您可以在Eloquent documentation中阅读更多内容。
重点是,直到您致电 ->get()
或->first()
,您正在使用构建器对象。实际上还有->find()
方法,用于通过pk
检索记录,你不能用它来通过约束(在哪里)搜索记录,但它也返回模型对象。