Laravel验证数组中无评论关联的帖子ID实现方案问询
实现方法
你可以通过两种方式实现这个验证规则:自定义Rule类或者直接使用闭包规则,以下是具体操作步骤:
方式一:自定义Rule类(适合复用或复杂逻辑场景)
- 生成Rule类文件
在终端执行Artisan命令创建规则文件:
php artisan make:rule HasNoComments
- 编写规则验证逻辑
打开app/Rules/HasNoComments.php,修改passes和message方法:
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; use Illuminate\Support\Facades\DB; class HasNoComments implements Rule { public function passes($attribute, $value) { // 检查comments表是否存在当前post_id的关联记录,不存在则验证通过 return !DB::table('comments')->where('post_id', $value)->exists(); } public function message() { return '帖子 :attribute 存在关联评论,无法执行归档操作。'; } }
- 在请求验证类中引用规则
打开ArchivePostsCollectionRequest.php,在rules方法里给data.*.id字段添加这个新规则:
<?php namespace App\Http\Requests; use App\Rules\HasNoComments; use Illuminate\Foundation\Http\FormRequest; class ArchivePostsCollectionRequest extends FormRequest { public function rules() { return [ 'data' => 'required|array', 'data.*.id' => [ 'required', 'integer', 'unique:data.*.id', // 确保数组内ID不重复 'exists:posts,id,status,!=,default', // 原规则:验证帖子存在且为非默认状态 new HasNoComments(), // 新增的无关联评论验证规则 ], ]; } }
方式二:闭包规则(适合简单逻辑,无需单独创建文件)
直接在请求验证类的rules方法中使用闭包,省去创建Rule类的步骤:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\DB; class ArchivePostsCollectionRequest extends FormRequest { public function rules() { return [ 'data' => 'required|array', 'data.*.id' => [ 'required', 'integer', 'unique:data.*.id', 'exists:posts,id,status,!=,default', // 嵌入闭包验证逻辑 function ($attribute, $value, $fail) { if (DB::table('comments')->where('post_id', $value)->exists()) { $fail("ID为{$value}的帖子存在关联评论,无法归档。"); } }, ], ]; } }
注意事项
data.*.id是Laravel数组验证的语法,会自动遍历data数组中的每个元素,对其id字段逐一验证- 原规则中的
unique如果是验证posts表内ID唯一,可改为unique:posts,id;如果是确保当前请求数组内ID不重复,保留unique:data.*.id即可 - 两种方式都会自动对数组中的每个ID执行所有验证规则,只要有一个ID不满足条件,整个请求就会返回验证失败
内容的提问来源于stack exchange,提问作者user3467896
相关产品推荐
相关产品推荐

