Symfony2多对多唯一约束

时间:2014-03-27 17:25:38

标签: symfony

我们说我有一个Thing实体,一个Group实体和一个Year实体。每个集团属于一年。然而,事情与岁月没有任何关系。事物和群体之间存在多对多的关系(一个群体由多个事物组成,而事物可以属于多个群体)。

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:注意:未定义的索引:/var/www/vhosts/myhost.local/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php 1665行中的joinColumns

1 个答案:

答案 0 :(得分: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(),
    ));
}