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 = 37和status = 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)
您可以将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)
| 归档时间: |
|
| 查看次数: |
772 次 |
| 最近记录: |