2015-04-02 71 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

    最好的運氣