Laravel用户名,如果已使用,则带有数字
我想进行用户注册,这样如果用户使用名称注册,比如说“John”,并且这个用户名已经被使用,那么他将获得用户名“John2”,如果“John2”也被使用,那么他将获得“John3”等等 我可以做一些循环来检查用户名是否被使用,并生成一个新的用户名。但这是没有效率的Laravel用户名,如果已使用,则带有数字,laravel,registration,user-registration,Laravel,Registration,User Registration,我想进行用户注册,这样如果用户使用名称注册,比如说“John”,并且这个用户名已经被使用,那么他将获得用户名“John2”,如果“John2”也被使用,那么他将获得“John3”等等 我可以做一些循环来检查用户名是否被使用,并生成一个新的用户名。但这是没有效率的 有什么想法吗?使用此功能:在参数中传递用户名,并根据您的数据库获取唯一的名称 public function generateUniqueUserName($username) { $username = str
有什么想法吗?使用此功能:在参数中传递用户名,并根据您的数据库获取唯一的名称
public function generateUniqueUserName($username)
{
$username = strtolower($username);
$variations = 0;
while (true) {
$newUserName = $username;
if ($variations > 0) {
$newUserName .= (string) $variations;
}
$userExist = User::where('username', $newUserName)->exists();
if ($userExist) {
$variations++;
} else {
$username = $newUserName;
break;
}
}
return $username;
}
请尝试下面的解决方案
$username = \Str::slug('John');
$userRows = User::whereRaw("username REGEXP '^{$username}([0-9]*)?$'")->pluck('username')->toArray();
if(count($userRows) > 0) {
$userRows = str_replace($name, '', $userRows);
$i=1;
while(in_array($i, $userRows)) {
$i++;
}
$username = $username.$i;
}
echo $username;
并将以下内容添加到config/app.php中的别名数组中
'Str' => 'Illuminate\Support\Str',
我假设您有“用户”模型,“用户名”作为您的字段,并且您使用的是“slug”这是非常低效的,您在while-true循环中进行查询:/n我们都知道while(true)的作用,问题是您不应该以这种方式使用它。在繁忙的站点上,对于“asdf”这样的通用用户名,您的
while(true)
可能会导致一百万次查询,只是为了找到唯一的值。如果用户找到了,那么循环中断,那么如何导致一百万次查询?对,@ShaileshLadumor曾经获得唯一的用户名循环中断。请让我知道downvote的原因以更正我自己。您没有发布任何解释您解决方案背后的原因。“尝试下面的解决方案”并不能帮助解释为什么您认为您的解决方案是正确的或比其他解决方案更好,也无助于OP了解它的作用。感谢@meagar的回复。我不确定是否每个答案都需要解释。这很直截了当。我只是想帮助OP快速解决他的问题&如果他需要,我可以向他解释。如果投反对票,大多数OP甚至不尝试解决方案,即使它解决了他们的问题。无论如何,我会发布一个解释。我想知道如何将一个问题标记为与另一个问题完全相同的问题。此处标记的问题完全相同,但选定的答案不是最佳答案。是的,其他答案给出了一个公平的想法,即如何接近它。我见过很多问题被标记为与其他问题完全相同,但它们并不完全相同。我要求那些将问题标记为其他问题完全重复的特权用户可以分析其他问题的所有答案,以了解这是否有助于OP解决他的问题。Thanks@manian如果你有一个你认为比副本中的答案更好的答案,就把它贴在那里。重复的问题应该关闭,不管现有问题的答案质量如何。好的,明白了。感谢@meagar的澄清