4

我不确定这是否是真正导致我的问题的原因,但也许有人会知道。当我使用 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

4

1 回答 1

3

错误消息实际上是自我解释的。当你这样做时,User::where('provider_id', $social_user->id)你最终会得到实现Illuminate\Database\Eloquent\Builder. 您可以调用->get()它来获取结果集合(在您的案例中实现的对象集合Illuminate\Contracts\Auth\Authenticatable,因此您可以迭代它们),或者像您所做的那样,您可以获得第一个匹配项->first()(一个实现的对象)Illuminate\Contracts\Auth\Authenticatable。您可以在Eloquent 文档中阅读更多内容。

要点是,直到您调用 ->get()->first()您正在使用builder object。实际上还有一个->find()方法,就是用来通过 检索记录pk,你不能用它来通过约束(哪里)搜索记录,但它也返回模型对象。

于 2016-05-16T05:53:47.617 回答