Laravel 8 校验自定义生成用户名是否存在功能异常问题
问题原因与修复方案
1. 原有校验逻辑永远触发的原因
你写的if(User::where('name',$a))判断逻辑永远返回真,因为where()方法返回的是查询构造器对象,并非查询结果。在PHP中,所有对象转布尔值时都为true,所以不管用户名是否存在,都会触发跳转逻辑。
如果要保留手动判断的写法,修改为以下代码即可:
$a = 'C'.$request['cedula']; if(User::where('name', $a)->exists()){ return redirect()->back()->withErrors(['Un usuario con ese nombre ya existe, revise la cédula y el rol']); }
exists()方法会直接返回布尔值:匹配到对应数据时返回true,未匹配到返回false,完全符合你的校验需求。
2. Class "App\Http\Controllers\Rule" not found报错的修复
这个报错是因为你使用了Laravel的Rule验证类,但没有在控制器顶部导入对应的命名空间。在你当前控制器的use声明区域添加以下代码即可解决:
use Illuminate\Validation\Rule;
另外你当前的unique规则可以简化,不需要额外加where条件,也可以直接用闭包验证,写法更直观:
'cedula' => [ 'required', 'digits:10', 'numeric', function ($attribute, $value, $fail) { $username = 'C' . $value; if (User::where('name', $username)->exists()) { $fail('Un usuario con ese nombre ya existe, revise la cédula y el rol'); } }, ],
注意事项
所有校验逻辑必须放在Persona::create()和User::create()之前执行,避免出现先插入了Persona数据、才发现用户名重复的脏数据问题。
内容的提问来源于stack exchange,提问作者Diego Utreras
相关产品推荐
相关产品推荐

