php - 一个实体上有多个 @UniqueEntity 注释

标签 php symfony doctrine-orm constraints

我有一个具有两个唯一索引的实体。我喜欢添加两个 UniqueEntity 出于验证目的对实体的约束。

给定实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="sample", uniqueConstraints={
 *     @ORM\UniqueConstraint(columns={"user_id", "hash"}),
 *     @ORM\UniqueConstraint(columns={"user_id", "name"})
 * })
 * @UniqueEntity(fields={"user", "jobSearch"}, message="duplicate_hash")
 * @UniqueEntity(fields={"user", "name"}, message="duplicate_name")
 */
class SampleEntity
{
    // ...
}

问题:只有最后一个@UniqueEntity得到尊重。因此,只有 username 的重复键才能被识别,反之亦然,只有 userjobSearch 如果我切换 UniqueEntity 注释。

是否有任何解决方案可以用@UniqueEntity覆盖两个唯一索引?

最佳答案

我通过使用自定义验证解决了这个问题。示例代码;
src/AppBundle/Validator/Constraints

<?php
// src/AppBundle/Validator/Constraints/UniqueCodeName.php
namespace AppBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class UniqueCodeName extends Constraint
{
    public $message = "must have a unique code and name.";

    public function validatedBy()
    {
        return 'code_name';
    }
}

还有

<?php
// src/AppBundle/Validator/Constraints/UniqueCodeName.php
namespace AppBundle\Validator\Constraints;

use Doctrine\ORM\EntityManager;

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

/**
 * @Annotation
 */
class UniqueCodeNameValidator extends ConstraintValidator
{
    private $entityManager;

    public function __construct(EntityManager $em) 
    {
        $this->entityManager = $em;
    }

    public function validate($value, Constraint $constraint)
    {
        $formCampaign = $this->context->getRoot()->getData();
        $code_name = $formCampaign->getClient()->getCode().$formCampaign->getCode();
        $campaigns = $this->entityManager->getRepository('AppBundle:Campaign')->findBy(
            [
                'code' => $code_name, 
                'name' => $formCampaign->getName()
            ]
        );

        if ($campaigns) {
            $this->context->buildViolation($constraint->message)
                ->addViolation();
        }
    }
}

约束的服务声明;

services:
    validator.unique.campaign_code_name:
            class: AppBundle\Validator\Constraints\UniqueCodeNameValidator
            tags:
                - { name: validator.constraint_validator, alias: code_name }
        arguments: ["@doctrine.orm.entity_manager"]

实体类示例;

<?php // src/AppBundle/Enitiy/Campaign.php
namespace AppBundle\Entity;
use AppBundle\Validator\Constraints as AppAssert;
use Doctrine\ORM\Mapping as ORM,
    Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity,
    Symfony\Component\Validator\Constraints as Assert;
use \DateTime;

/**
 * Campaign
 *
 * @ORM\Table(name="campaign")
 * @ORM\Entity(repositoryClass="AppBundle\Entity\CampaignRepository")
 * @UniqueEntity(fields={"code", "name"})
 */
class Campaign 
{
    // other stuff

    /**
     * @var string
     *
     * @ORM\Column(name="code", type="string", length=255, unique=true)
     */
    private $code;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255, unique=true)
     */
    private $name;

    /**
     * Get code
     *
     * @Assert\Length(min=2, max=11, groups={"create", "update"})
     * @Assert\Regex(pattern="/\d/", match=true, message="Code must be numeric", groups={"create", "update"})
     * @Assert\NotBlank(groups={"create", "update"})
     * @AppAssert\UniqueCodeName(groups={"create", "update"})
     * @return string
     */
    public function getCode()
    {
        return $this->code;
    }
}

关于php - 一个实体上有多个 @UniqueEntity 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35502268/

相关文章:

php - Woocommerce - 外部/附属产品图片和外部链接的标题(新标签)

javascript - php/mysql 动态下拉菜单的 AJAX RETURN 帮助

php - 在查询sql中比较字符串和数组

php - 更新到 Symfony 3.0 时找不到类 'Appkernel'

javascript - Symfony3 : Adding extra security before loading login form

php - 如何与相关实体独立设置 Symfony2 Bundles

php - Laravel 5.2 $errors 未出现在 Blade 中

MongoDB ODM 索引 : How to Index multiple Compound index on a documnt that have EmbeddedDocument in itself?

php - Doctrine : how to use Replace function

php - 如何提取 anchor 标记内的所有 img 标记?