我有一个表存储密码重置令牌。该表中有4个字段。它们是user_id
,token
,created_at
和updated_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)));
来解决了我的错误。
答案 0 :(得分:1)
在加载主模型后更改相关模型,这将导致主模型的关系过时,可以通过重新加载关系来解决此问题。
在您的情况下,您可以使用:
$user->load('passwordResetLink');
前
Mail::to($user)->send(New \App\Mail\PasswordResetLink($user));
这将仅重新加载PasswordResetLink
并防止必须重新加载整个对象。