Laravel奇怪的错误:Eloquent模型更改为Builder类的实例

时间:2015-02-25 19:09:38

标签: php laravel laravel-4

我正在使用laravel 4.2。我有这个奇怪的错误。

我尝试做的只是将UserEloquent模型)的此对象传递给scopeSendTo模型的方法EmailVerification;并遇到了这个我无法弄清楚的奇怪错误。

这是我的代码:

class EmailVerification extends Eloquent
{
    ...
    public function scopeSendTo(User $user, $type)
    {
        $token = Str::slug(microtime(true).Hash::make(Str::random(20)));

        $verification = new EmailVerification([
            'token' => $token,
            'type' => $type,
        ]);

        $user->verifications()->save($verification);

        Mail::send('emails.verification', ['verification' => $verification], function ($message) {

            $name = $user->profile ? $user->profile->first_name : '';

            $message->to($user->email, $name)->subject('Account Verification');

        });
        ...
    }
    ...
}

我试图像这样使用这种方法:

$user = User::find($userId);

EmailVerification::sendTo($user, 'signup');

但它引发了这个错误:

enter image description here

我甚至尝试过dd(get_class($user))来确认传递的对象是User对象,而不是Illuminate\Database\Eloquent\Builder的实例;但我无法弄清楚这里有什么问题。

1 个答案:

答案 0 :(得分:1)

Query Scopes有助于在模型中重用查询逻辑。这意味着传递给scope方法的第一个参数是一个查询构建器实例,可以对其进行操作并返回以允许方法链接。在您的情况下,范围方法定义应如下所示:

public function scopeSendTo($query, User $user, $type)
{
    // code goes here
}

虽然上面的代码可行,但这是一个糟糕的方法,因为这不是Eloquent模型范围的预期目的。

我建议您修改解决此问题的策略。 This answer为使用Laravel的集成身份验证服务实施电子邮件验证提供了一些很好的建议,或者您可以考虑使用更强大的身份验证解决方案,例如Confide