2015-10-13 101 views
0

用戶代碼已生成並且必須是唯一的。在此模型保存上執行重試邏輯的最簡單/最乾淨的方式是什麼?我想首先驗證生成的代碼,然後如果在用戶表中找不到它,則創建用戶(如果找到),循環以重試。那是什麼語法?由於模型保存的重試邏輯 - Laravel

public function create(array $data) 
{ 
    $user = User::create([ 
     'user_name' => 'My user name', 
     'user_code' => bin2hex(openssl_random_pseudo_bytes(16)) 
    ]); 

    $user->save(); 

    return $user; 
} 

回答

2

爲什麼在生成代碼時檢查數據庫?這樣一來,只有在您正確的時候纔會嘗試創建,最終用戶不必面對不符合他/她的錯誤。

do { 
    $code = bin2hex(openssl_random_pseudo_bytes(16)); 
    $record = User::where('user_code', $code)->get(); 
} while(!empty($record)); 

$user = User::create([ 
    'user_name' => 'My user name', 
    'user_code' => bin2hex(openssl_random_pseudo_bytes(16)) 
]); 

return $user; 
+0

謝謝。我喜歡! – user3489502

+0

'bin2hex(openssl_random_pseudo_bytes(16))'這個函數能產生兩次相同的數字嗎?如果不是你如何獲得相同的條件使用'User :: where('user_code',$ code) - > get()'它每次生成的數字都不同於你插入數據庫''user_code'=> bin2hex openssl_random_pseudo_bytes(16))'@ marco-aurélio-deleu –

+1

openssl_random_pseudo_bytes(16)生成一個隨機字符串,不一定是唯一的 – user3489502

0

你可以避開重試:

public function create(Request $request) 
{ 
    $request->merge(['user_code' => bin2hex(openssl_random_pseudo_bytes(16))]); 

    $this->validate($request, [ 
     'user_name' => 'required|unique:users', 
     'user_code' => 'required|unique:users', 
    ]); 

    $user = new User; 

    $user->user_name = $request->user_name; 
    $user->user_code = $request->user_code; 

    $user->save(); 

    return $user; 
} 
+0

謝謝這是乾淨的。如果user_code在保存時不是唯一的,會發生什麼情況? – user3489502

+0

如果它不是唯一的,Laravel將重定向回來並顯示正確的驗證錯誤,'save()'不會被觸發。 – user2094178

+0

好吧,但這對於最終用戶來說都是隱藏的,這就是爲什麼我想嘗試重新生成新的user_code並嘗試再次保存的原因。我不想向用戶顯示錯誤 – user3489502

0

你應該從創建之初的唯一字符串。當然,還是去驗證。

public function create(Request $request) 
{ 
    $user_code = bcrypt($request->user_name . openssl_random_pseudo_bytes(16)); 
    $request->merge(['user_code' => $user_code]); 

    $this->validate($request, [ 
     'user_name' => 'required|unique:users', 
     'user_code' => 'required|unique:users', 
    ]); 

    $user = User::create($request); 

    return $user; 
} 

create()隱含save()。

+0

謝謝,但user_name不唯一。我唯一的唯一列是id,但它尚未創建。 – user3489502

+0

@ user3489502 user_name應該是唯一的。無論如何,你可以使用time()等其他東西來添加熵。 – mniess