如何在Laravel Livewire中通过自定义验证防止数据库重复录入教室数据
Laravel 实现教室ID重复校验的两种方案
方案1:直接使用内置unique验证规则(推荐,无需自定义规则)
你不需要额外编写自定义验证类,Laravel自带的unique规则完全满足需求,直接修改你saveCourse方法里的验证逻辑即可:
public function saveCourse(){ // 校验规则新增unique:courses,classroom_id,意思是检查courses表的classroom_id字段是否存在重复值 $validated = $this->validate([ 'course_name' => 'required', 'classroom_id' => 'required|unique:courses,classroom_id' ], [ // 自定义错误提示 'classroom_id.unique' => '该教室已存在' ]); $course = new Course(); // 注意Livewire组件属性需要加$this->调用,你原写法未加会报错 $course->name = $this->course_name; $course->classroom_id = $this->classroom_id; $course->save(); $this->render(); }
如果你后续要做更新课程的场景,需要排除当前课程的ID不做重复校验,规则可以改成
unique:courses,classroom_id,' . $this->course_id即可。
方案2:创建自定义验证规则(适合更复杂的校验逻辑)
如果你的校验逻辑后续有扩展需求,可以创建独立的验证规则类:
- 执行Artisan命令生成规则类
php artisan make:rule UniqueClassroom
- 打开生成的
app/Rules/UniqueClassroom.php文件,修改逻辑:
<?php namespace App\Rules; use App\Models\Course; use Illuminate\Contracts\Validation\Rule; class UniqueClassroom implements Rule { // 编辑场景传入当前课程ID,新增场景可以不传 protected $ignoreId; public function __construct($ignoreId = null) { $this->ignoreId = $ignoreId; } // 校验逻辑 public function passes($attribute, $value) { $query = Course::where('classroom_id', $value); if ($this->ignoreId) { $query->where('id', '!=', $this->ignoreId); } return $query->doesntExist(); } // 错误提示 public function message() { return '该教室已存在'; } }
- 在验证逻辑中调用自定义规则:
use App\Rules\UniqueClassroom; public function saveCourse(){ $validated = $this->validate([ 'course_name' => 'required', // 新增场景直接实例化即可,编辑场景传要排除的课程ID:new UniqueClassroom($this->course_id) 'classroom_id' => ['required', new UniqueClassroom()] ]); // 后续保存逻辑不变 $course = new Course(); $course->name = $this->course_name; $course->classroom_id = $this->classroom_id; $course->save(); $this->render(); }
你的前端代码不需要做任何修改,<x-jet-input-error>组件会自动读取验证错误消息展示给用户。
内容的提问来源于stack exchange,提问作者wertyu
相关产品推荐
相关产品推荐

