2014-03-27 158 views
1

比方說,我有一個Thing實體,一個Group實體和一個Year實體。每個組都屬於一年。但是,事情與年代沒有關係。事物和羣體之間存在着多對多的關係(一個羣體由幾件事物組成,一件事物可以屬於幾個羣體)。Symfony2多對多的唯一約束

My\MainBundle\Entity\Group: 
    type: entity 
    manyToOne: 
     year: 
      targetEntity: Year 
    manyToMany: 
     things: 
      targetEntity: Thing 
      joinTable: 
       name: groups_things 
       joinColumns: 
        group_id: 
         referencedColumnName: id 
       inverseJoinColumns: 
        thing_id: 
         referencedColumnName: id 

我想要做的就是確保,給定年份,一組是獨一無二的。也就是說,如果在2014年,我有一個擁有第1,2和3件物品的集團,我不想阻止該用戶創建同年和同一件物品的另一個集團。然而,再創造一個同樣東西的團隊再好一年。

我不知道要在我的validation.yml文件中放置什麼,以防止用戶在同一年創建具有相同事物的多個組。

我已經試過:

My\MainBundle\Entity\Group: 
    constraints: 
     - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 
      fields: [year, things] 
      message: This group already exists. 

,但它不工作。我得到一個異常:

ContextErrorException:注意:未定義指數:joinColumns在/var/www/vhosts/myhost.local/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php線1665

+0

根據你提供的信息,我不認爲這是可能的與約束nts獨自。在插入新組之前,您需要添加自己的邏輯來驗證這一點。 – Chausser

回答

0

我無法弄清楚如何做到這一點的validation.yml文件(不知道它甚至有可能),所以我加了一個控制器中的檢查(在「創建」行動):

public function createAction(Request $request) 
{ 
    $entity = new Group(); 
    $form = $this->createCreateForm($entity); 
    $form->handleRequest($request); 

    $em = $this->getDoctrine()->getManager(); 

    $things_ids_in_new_group = array(); 

    foreach($entity->getThings() as $thing) 
    { 
     $things_ids_in_new_group[] = $thing->getId(); 
    } 

    if(!empty($things_ids_in_new_group)) 
    { 
     $groups = $em->getRepository('MyMainBundle:Group')->findBy(array('year' => $entity->getYear())); 
     foreach($groups as $g) 
     { 
      $things_ids_in_existing_group = array(); 
      foreach($g->getThings() as $t) 
      { 
       $things_ids_in_existing_group = $t->getId(); 
      } 
      if($things_ids_in_new_group == $things_ids_in_existing_group) 
      { 
       $form->addError(new \Symfony\Component\Form\FormError('This group already exists.')); 
       break; 
      } 
     } 
    } 

    if ($form->isValid()) 
    { 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('groups_show', array('id' => $entity->getId()))); 
    } 

    return $this->render('MyMainBundle:Group:new.html.twig', array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    )); 
}