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

时间:2015-10-13 15:00:42

标签: php laravel laravel-5

生成User_code并且必须是唯一的。在这个模型上执行重试逻辑的最简单/最干净的方法是什么?我想首先验证生成的代码,然后如果在users表中找不到它,则创建用户,如果找到,则循环重试。那会是什么语法?感谢

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;
}

3 个答案:

答案 0 :(得分: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' => $code
]);

return $user;

答案 1 :(得分: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;
}

答案 2 :(得分: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()。