2015-10-13 2 views
0

User_code генерируется и должен быть уникальным. Каким будет самый простой/чистый способ повторить логику восстановления этой модели? Сначала я хочу проверить сгенерированный код, а затем, если он не найден в таблице пользователей, создайте пользователя, если он найден, loop для повторной попытки. Каким будет синтаксис для этого? БлагодаряЛогика повтора при сохранении модели - 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()' его каждый раз генерирует другое число, чем вы вставляете в db ''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; 
} 

Сохранение() подразумевается при создании().

+0

Спасибо, но user_name не уникально. Единственный единственный столбец, который у меня есть, - id, но он еще не создан. – user3489502

+0

@ user3489502 user_name должно быть уникальным. В любом случае вы можете использовать другие вещи, такие как time(), чтобы добавить энтропию. – mniess

Смежные вопросы