You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel验证数组中无评论关联的帖子ID实现方案问询

实现方法

你可以通过两种方式实现这个验证规则:自定义Rule类或者直接使用闭包规则,以下是具体操作步骤:

方式一:自定义Rule类(适合复用或复杂逻辑场景)

  1. 生成Rule类文件
    在终端执行Artisan命令创建规则文件:
php artisan make:rule HasNoComments
  1. 编写规则验证逻辑
    打开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 存在关联评论,无法执行归档操作。';
    }
}
  1. 在请求验证类中引用规则
    打开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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:47:30