2015-04-02 34 views
1

什么是最好的方式来检查是否有记录存在之前坚持一种形式?主义Symfony检查记录之前坚持

  • 使用Pre Perist?但是,我可以使用查询
  • 在控制器中使用查询,如果存在抛出异常
  • 我的课

我冲这https://stackoverflow.com/a/10688065/3942705在PHP/MySQL的查询,但我想这样做的

  • 使用存储库与symfony。

  • +0

    这要看是什么你检查的目的。如果你有独特的列,你可以应用验证等。 – stevenll 2015-04-02 11:31:05

    +0

    假设我有一个图像位置字段(1,2,3,4,...)在DB中,对应于产品图像的位置。我不能使用独特的,因为我可以有两个位置1为不同的产品。所以我想检查一下产品“n”是否与新图像给出的位置不同。如果不行,我会给出错误信息。我希望我的解释更加精确。 – 2015-04-02 13:08:32

    +0

    那么一个'Product'可以有许多'Image'实体?你想确保产品内的图像位置只被采取一次? – stevenll 2015-04-02 16:04:20

    回答

    1

    我打算发布一个解决方案,这可能不是最好的性能方案,但它可以工作,您可以进一步优化它。

    设想:AcmeBundle是您的包命名空间,ProductMedia是您的实体。您需要为您的产品添加验证,我已使用YML,您可以更改此设置。

    在:AcmeBundle\Resources\config\validation.yml

    AcmeBundle\Entity\Product: 
        constraints: 
         - Callback: { methods: [validate] } 
    

    在:AcmeBundle\Entity\Product

    class Product 
    { 
        /** 
        * @var \Doctrine\Common\Collections\Collection 
        */ 
        private $media; 
    
        [...] 
    
        /** 
        * @param ExecutionContextInterface $context 
        */ 
        public function validate(ExecutionContextInterface $context) 
        { 
         $allowedPositions = array(1, 2, 3, 4); 
    
         foreach ($allowedPositions as $position) { 
          $atThisPosition = $this->media->filter(function(Media $media) { 
           return $media->getPosition() === $position; 
          }); 
    
          $count = $atThisPosition->count(); 
    
          if ($count > 1) { 
           $context->addViolationAt('media', sprintf("Trying to set %d media at position %d", $count, $position)); 
          } 
         } 
        } 
    } 
    
    0

    好吧,如果你想你的记录将是唯一的,那么你可以使用实体验证检查记录是否是唯一的或者不。假设你有一个用户实体。如果用户的电子邮件或用户名已经存在,那么用户将无法坚持数据库,可以通过检查电子邮件和用户名属性来确定它们是否已经存在,也就是说它们是唯一的或不。有关实体验证的详细信息,您可以看到以下链接:http://symfony.com/doc/current/book/validation.html

    ,如果你想了解UniqueEntity validaiton你可以看到这个链接更具体地说:http://symfony.com/doc/current/reference/constraints/UniqueEntity.html#basic-usage

    最好的运气