我们说我有一个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
答案 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(),
));
}