2017-08-01 30 views
0

我有一張表,用於存儲密碼重置令牌。該表中有4個字段。它們是user_id,token,created_atupdated_at爲什麼我不能使用在Laravel中使用相同請求創建的相關模型?

我想要做的是檢查用戶是否已經有密碼重置令牌。如果用戶已經擁有密碼重置令牌,我想發送具有相同標記的電子郵件。如果用戶沒有令牌,我想創建令牌然後發送電子郵件。

問題是,如果令牌已經創建,我可以發送電子郵件。但是,我收到錯誤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()不能正常工作,因爲我沒有在我的數據庫中的表password_resets領域id。讓我知道代碼有什麼問題。我知道save()不會工作,因爲我沒有更新任何東西!

更新:我解決了我的錯誤,將郵件行替換爲Mail::to($user)->send(New \App\Mail\PasswordResetLink(User::find($user->id)));

回答

1

您在加載主模型後更改相關模型,這會導致主模型的關係過時,可以通過重新加載關係來解決此問題。

你的情況,你可以使用:

$user->load('passwordResetLink'); 

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

這將重新加載只有PasswordResetLink,防止重新加載整個對象。

+0

它的工作!謝謝! –

+0

是啊!我也刪除了我的評論! –

相關問題