【发布时间】:2018-11-04 15:07:30
【问题描述】:
我创建了一个函数来在用户注册时为他们生成一个唯一的推荐代码,我想确保唯一性,所以我检查它是否已经存在,如果存在,那么我再次递归调用该函数:
public function generateUniqueReferralCode()
{
$referral_code = str_random(8);
if(User::where('referral_code', $referral_code)->exists()) {
$referral_code = $this->generateUniqueReferralCode();
}
return $referral_code;
}
我的问题是,这计算成本高吗?是否可以以更有效的方式完成,因为它必须扫描用户表?假设我们有 100 万用户,如果密钥已经存在,它将检查 100 万用户记录。
【问题讨论】:
-
在表列中添加 UNIQUE 约束将是一个更好的选择,如果插入失败再试一次。
-
你可以用一个更快的简单循环来替换递归,但总的来说,我会说递归的性能应该不会太差,只要 str_random(8) 真的生成随机字符串。但一如既往:对其进行基准测试:)
-
@Shubanker 你的意思是在数据库级别?我的迁移中有以下内容:
$table->string('referral_code')->unique()->nullable(); -
在这种情况下,约束不允许插入重复的推荐代码,并且会抛出一个错误,您只需要处理它们,我也不知道您为什么要这样做
nullable() -
在 MySQL 中,可以在具有唯一约束的表中有多个空值:stackoverflow.com/questions/3712222/…
标签: php performance laravel-5 optimization