为什么我不能在Laravel中使用相同请求创建的相关模型?

时间:2017-08-01 15:53:15

标签: php laravel laravel-5

我有一个表存储密码重置令牌。该表中有4个字段。它们是user_idtokencreated_atupdated_at

我想要做的是,检查用户是否已经拥有密码重设令牌。如果用户已经拥有密码重置令牌,我想发送一封具有相同令牌的电子邮件。如果用户没有令牌,我想创建令牌,然后发送电子邮件。

问题是,如果已经创建了令牌,我可以发送电子邮件。但是,我收到错误Trying to get property of non-object (View: /var/www/html/project_name/resources/views/emails/passwordResetLink.blade.php)

为什么在数据库中创建记录后,无法直接使用$user->passwordResetLink->token访问密码重置令牌?这是我的代码。

$user = User::findByUsername(request('username'));
if($user)
{
    if(count($user->passwordResetLink))
    {
        $user->passwordResetLink->save();
    }
    else
    {
        $token = md5(str_random(16));

        $record = new PasswordReset;
        $record->user_id = $user->id;
        $record->token = $token;
        $record->save();
    }

    Mail::to($user)->send(New \App\Mail\PasswordResetLink($user));
    return 1;
}

我正在尝试使用$user->passwordResetLink->token访问用户的密码重置令牌。如果记录已经创建,它工作正常,但如果记录不存在则不能正常工作。

PS:我正在使用save(),因为touch()无效,因为我的id表中没有password_resets字段在数据库中。让我知道代码有什么问题。我知道save()无效,因为我没有更新任何内容!

更新:我通过将邮件行替换为Mail::to($user)->send(New \App\Mail\PasswordResetLink(User::find($user->id)));来解决了我的错误。

1 个答案:

答案 0 :(得分:1)

在加载主模型后更改相关模型,这将导致主模型的关系过时,可以通过重新加载关系来解决此问题。

在您的情况下,您可以使用:

$user->load('passwordResetLink');

Mail::to($user)->send(New \App\Mail\PasswordResetLink($user));

这将仅重新加载PasswordResetLink并防止必须重新加载整个对象。