重试逻辑上的模型保存- Laravel


Retry logic on model save - Laravel

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()