User_code已生成,且必须唯一。在此模型保存上执行重试逻辑的最简单/最干净的方法是什么?我想先验证生成的代码,然后如果它没有在用户表上找到,创建用户,如果找到,循环重试。用什么语法呢?由于
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;
}
为什么在生成代码时不检查数据库呢?这样,你只需要在正确的情况下进行创建,最终用户就不必面对一个不由他/她决定的错误。
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' => $code
]);
return $user;
可以避免重试:
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;
}
您应该从头创建一个唯一的字符串。当然,还是要进行验证。
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()