2017-07-16 78 views
0

我有一个Session实体,它具有整数$num属性。两个或更多个会话可以具有相同的$num值。 A Session可能属于若干Group实体。如何防止arraycollection中的重复值?

A Group也可以附加几个会话。创建Group时,用户可以将其包含的会话分配到ArrayCollection,但一个组不能有两个具有相同$num值的会话。

如何使用Symfony表单组件强制执行此限制,特别是使用CollectionType字段类型?

编辑:

这里的(单向)许多一对多的映射,从集团会议:

# Group.orm.yml 
manyToMany: 
    sessions: 
     targetEntity: Session 
     joinTable: 
      name: sessiongroups_sessions 
      joinColumns: 
       group_id: 
        referencedColumnName: id 
      inverseJoinColumns:   
       session_num: 
        referencedColumnName: num 

我在inverseJoinColumn(而不是id)设置$num作为参考列,所以sessiongroups_sessions表永远不会有两行或多行具有相同$num值的相同组ID引用会话。

这是从数据库的角度来看 罚款(编辑:显然不是,我认为这将没有想出来工作),我需要知道我可以在形式执行此,用户指定的会议组。

我知道存在一个约束,称为Collection,但它需要为集合的每个键指定验证程序。我知道我可以建立形式的会议添加到这样的集合:

$group = new Group(); 
$form = $this->createFormBuilder($group)->add('sessions', CollectionType::class, 
array('entry_type' => EntityType::class, 'entry_options' => array('class' => AppBundle:Group)); 

如何指定这里约束确保集合从不保存具有相同$num值两会?

+0

请首先显示一些代码。这是你在这方面的第二个问题。 – colburton

+0

我甚至不知道从哪里开始。我可以发布会话和组之间多对多关联的映射信息(如果有帮助的话)@colburton – MrWarlock616

+0

symfony中的表单组件太多了,以至于让我感到困惑 – MrWarlock616

回答

0

你需要和

假设你正在使用YAML映射,您在Group实体关联看起来是这样的:

manyToMany: 
    sessions: 
     targetEntity: Session 
     mappedBy: groups 
     indexBy: num 

然后,你需要修改制定者使用$num作为键太。更多信息在上述链接下的Doctrine文档。

很显然,如果有人试图根据您的需要添加Session以及现有的$num值,您还需要处理一个案例。

@edit:

我设置$ NUM作为inverseJoinColumn引用的列,(...),这是从数据库的角度来看

不,这不是很好。$numSession实体中并非唯一,因此在Group实体中具有$num值,因此无法识别任何特定的Session实例。它需要是一个独特的关键。

+0

谢谢!我会看看。同时,你能看到我的编辑,并帮助我使用表单组件来实现这一点吗? – MrWarlock616

+0

@ MrWarlock616看我的编辑。 –

+0

哦,我不知道inverseJoinColumn期望列在相关实体中是唯一的。谢谢! @Jakub Matczak – MrWarlock616