Symfony2 Doctrine2 UniqueEntity 验证指定一个值

Ser*_*gri 3 symfony doctrine-orm

我已经在时尚中使用 UniqueEntity ,例如:

/**
 * @ORM\Entity()
 * @ORM\Table(name="benefit_group_category")
 * @UniqueEntity(fields={"name", "project"}, ignoreNull=false, message="Duplicated group category for this project")
 */
Run Code Online (Sandbox Code Playgroud)

所以我已经知道如何使用它了。

在另一种情况下我需要做的是:

 * @UniqueEntity(fields={"entityId", "status"}, message="There is already a Quality Review Pending for this entity")
Run Code Online (Sandbox Code Playgroud)

但是我需要指定对于相同的entityIdif status == 1,我不能有重复的 if ,但是如果status == 0它应该通过验证。

基本上,例如,我可以有任意数量的记录entityId = 37status = 0,但只有一个记录status = 1

这可能吗?

编辑:请在这里找到它的更新版本,以进行仔细检查。在我最初的问题中,我忘了提及另一个参数(entityName),但它并没有改变它的本质。

存储库类

<?php

namespace AppBundle\Entity;

/**
 * QualityReviewRequestRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class QualityReviewRequestRepository extends \Doctrine\ORM\EntityRepository
{
/**
 * @param array $criteria
 * @return array
 */
public function getByEntityIdAndEntityNameAndStatusCriteria(array $criteria)
{
    // Todo remove this first return, it's done on purpose to force the system to throw an error, but it doesn't.
            return $this->createQueryBuilder('e') 
            ->andWhere('e.entityId = :entityId')
            ->setParameter('entityId', $criteria['entityId'])
            ->getQuery()
            ->getResult()
        ;

    if (QualityReviewRequest::STATUS_NEW == $criteria['status']) {
        return $this->createQueryBuilder('e')
            ->andWhere('e.entityId = :entityId')
            ->setParameter('entityId', $criteria['entityId'])
            ->andWhere('e.entityName = :entityName')
            ->setParameter('entityName', $criteria['entityName'])
            ->andWhere('e.status = :status')
            ->setParameter('status', $criteria['status'])
            ->getQuery()
            ->getResult()
        ;
    }

    return [];
}
}
Run Code Online (Sandbox Code Playgroud)

主要类:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * QualityReviewRequest
 *
 * @ORM\Table(name="quality_review_requests")
 * @ORM\Entity(repositoryClass="AppBundle\Entity\QualityReviewRequestRepository")
 * @UniqueEntity(fields={"entityId","entityName","status"}, repositoryMethod="getByEntityIdAndEntityNameAndStatusCriteria", message="There is already a Quality Review Pending for this entity")
 */
class QualityReviewRequest
{
    const STATUS_NEW = 0;
    const STATUS_DONE = 1;

    use TimestampableEntity;

    // removed useless stuff

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


    /**
     * @var integer
     *
     * @ORM\Column(name="entityId", type="integer")
     */
    private $entityId;

    // More stuff
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*lov 5

您可以将repositoryMethod选项添加到 UniqueEntity 约束注释中。

* @UniqueEntity(fields={"entityId", "status"}, repositoryMethod="getEntityByIdAndStatusCriteria", message="There is already a Quality Review Pending for this entity")
Run Code Online (Sandbox Code Playgroud)

并实现存储库方法以按定义的标准查找实体。

/**
 * @param array $criteria
 * @return array
 */
public function getEntityByIdAndStatusCriteria(array $criteria)
{
    if (1 == $criteria['status']) {
        return $this->createQueryBuilder('e')
            ->andWhere('e.entityId = :entityId')
            ->setParameter('entityId', $criteria['entityId'])
            ->andWhere('e.status = :status')
            ->setParameter('status', $criteria['status'])
            ->getQuery()
            ->getResult()
        ;
    }

    return [];
}
Run Code Online (Sandbox Code Playgroud)