生成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;
}
答案 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()。