【问题标题】:How to prevent duplicate values in a arraycollection?如何防止数组集合中的重复值?
【发布时间】:2017-07-16 16:41:12
【问题描述】:

我有一个 Session 实体,它有一个整数 $num 属性。两个或多个会话可以具有相同的$num 值。一个Session 可能属于多个Group 实体。

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

我将$num 设置为inverseJoinColumn 中的引用列(而不是id),因此sessiongroups_sessions 表永远不能有两行或多行具有相同组ID 的引用具有相同$num 的会话价值。

从数据库的角度来看这很好(编辑:显然不是,我认为这会在不尝试的情况下工作),我需要知道如何在 form 用户指定组的会话。

我知道有一个名为Collection 的约束,但它需要为集合的每个键指定一个验证器。我知道我可以构建表单以将会话添加到集合中,如下所示:

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

如何在此处指定一个约束以确保集合永远不会拥有两个具有相同$num 值的会话?

【问题讨论】:

  • 请先显示一些代码。这是您在这方面的第二个问题。
  • 我什至不知道从哪里开始。如果这有助于@colburton,我可以发布 Session 和 Group 之间的多对多关联的映射信息
  • symfony 中的表单组件太多了,让我很困惑
  • $builder->add('something', CollectionType::class ...) 位开头。
  • 你需要一个自定义类验证器

标签: symfony doctrine symfony-forms


【解决方案1】:

你需要和indexed association

假设您使用的是 yaml 映射,您在 Group 实体中的关联可能如下所示:

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

然后你需要修改你的设置器以使用$num 作为键。上面提到的链接下的 Doctrine Documentation 中的更多信息。

显然,当有人根据您的需要尝试使用现有 $num 值添加 Session 时,您还需要处理这种情况。

@编辑:

我将 $num 设置为 inverseJoinColumn 中的引用列,(...) 从数据库的角度来看这很好

不,不是。 $numSession 实体中不是唯一的,因此在Group 实体中具有$num 值,您无法识别任何特定的Session 实例。它必须是唯一的键。

【讨论】:

  • 谢谢!我去看看。同时,你能看看我的编辑,并帮助我使用表单组件来实现吗?
  • 哦,我不知道 inverseJoinColumn 期望列在相关实体中是唯一的。谢谢! @Jakub Matczak
  • 嘿,我检查了,Doctrine 允许我将 num 指定为 inverseJoinColumn。这将在数​​据库中强制执行我想要的限制,不是吗,因为 group_id 和 session_num 都将是生成的 sessiongroups_sessions 表中的 PK?
  • 想想 SQL。将获得与Group 关联的Session 的SQL 查询看起来如何?如果你做一个SELECT * FROM Session WHERE num = ?,你会得到几个Sessions作为一个num值,你不会知道哪个是正确的。
  • 组是关系的拥有方,所以我计划通过合并会话数组集合(在组实体中)来检索组中的所有会话
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 2021-09-23
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多