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

Symfony 5.4下一对多关联中验证Intervention的idate字段唯一性

解决方案:自定义约束验证多个Intervention的idate唯一性

由于Symfony 5.4不支持@Assert\Unique的fields选项,我们可以通过自定义验证约束实现需求,具体步骤如下:

1. 创建自定义约束类

在项目中创建src/Validator/Constraints/UniqueInterventionDate.php:

<?php

namespace App\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class UniqueInterventionDate extends Constraint
{
    public $message = "多个干预记录的日期不能重复,请确保每个干预的日期唯一。";

    public function getTargets()
    {
        return self::PROPERTY_CONSTRAINT;
    }

    public function validatedBy()
    {
        return static::class.'Validator';
    }
}

2. 创建对应的验证器类

接着创建src/Validator/Constraints/UniqueInterventionDateValidator.php,实现核心验证逻辑:

<?php

namespace App\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class UniqueInterventionDateValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        if (!is_iterable($value)) {
            return;
        }

        $dates = [];
        foreach ($value as $intervention) {
            $date = $intervention->getIdate();
            if (null === $date) {
                continue;
            }

            $dateString = $date->format('Y-m-d');
            if (in_array($dateString, $dates, true)) {
                $this->context->buildViolation($constraint->message)
                    ->atPath('[].idate')
                    ->addViolation();
                return;
            }

            $dates[] = $dateString;
        }
    }
}

3. 在Request实体中应用自定义约束

修改Request.php的$interventions属性,添加自定义约束注解:

/**
 * @ORM\OneToMany(targetEntity=Intervention::class, mappedBy="request")
 * @Assert\Count(min=1, max=3)
 * @Assert\Valid
 * @App\Validator\Constraints\UniqueInterventionDate
 */
private $interventions;

逻辑说明

  • 验证器会遍历Request关联的所有Intervention实例,将idate转为字符串后对比去重
  • 若发现重复日期,会触发验证错误并指向对应的intervention的idate字段
  • 结合已有的@Assert\Valid约束,会先完成Intervention自身字段的验证,再执行唯一性检查

内容的提问来源于stack exchange,提问作者barbuslex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:06:33