表单 - 管理OneToMany集合元素

时间:2016-08-23 09:40:27

标签: doctrine-orm symfony

让我们想象这两个实体:

ShoppingCart
    creationDate

Item
    name
    shoppingCart  # ManyToOne

我在ShoppingCart CollectionType

的表单中管理Items
public function buildForm(FormBuilderInterface $builder, array $options)
{
    // ...
    $builder
    // ...
        ->add('items', CollectionType::class, array(
            'entry_type' => ItemFormType::class,
    // ...
}

我希望我的用户能够添加/删除项目,这在我看来非常普遍。

如果我理解得很好,这就是我要做的事情:

  • 定义与OneToMany
  • ShoppingCart关系的反向Item
  • 确保此关系包含cascade={"persist"}orphanRemoval=true选项
  • 将此项Collection初始化为构造函数
  • allow_addallow_delete表单选项设置为 true
  • by_reference表单选项设置为 false
  • 确保andItem()& removeItem()功能已在ShoppingCart
  • 中实施
  • 除了ShoppingCart项目集合中添加/删除Item之外,设置/取消设置与ShoppingCart的拥有方关系
  • 将集合索引保留在javascript中,以便Doctrine可以跟踪引用

我忘记了什么吗?

与需求和其他框架/ ORM相比,我觉得这对我来说是一个巨大的痛苦

有没有办法更简单?

2 个答案:

答案 0 :(得分:0)

据我所知,你的问题是“为什么这么复杂”,不是吗?

嗯,事实并非如此。您已在项目中列出了多个图层。为了夸大这一点 - 你为什么不写这个以创建这个表单你需要安装Symfony甚至打开你的电脑。 ; - )

无论如何,大多数这些事情都不是必需的,其他事情应该在此之前完成。

让我们从您的OneToMany关系(学说级别)开始。

ShoppingCart是您的聚合根(DDD术语,但是如果您遵循DDD想法并不重要),这意味着您可能会对此对象执行大部分工作,这将处理Item s内。如果是这样,那么你应该完成关系的反面,它涵盖了这些要点(我认为你已经详细介绍了如何使你的列表更长;-),它们都应该在一个列表项中),但它需要一个分钟做这件事:

  
      
  • 将ShoppingCart关系的反向OneToMany侧定义为Item
  •   
  • 确保此关系具有cascade = {“persist”}和orphanRemoval = true选项
  •   
  • 将此项目集合初始化为构造函数
  •   
  • 确保andItem()& removeItem()函数已实现到ShoppingCart
  • 中   
  • 除了在ShoppingCart项目集合中添加/删除项目外,设置/取消设置与ShoppingCart的拥有方关系
  •   

这与表格无关。这是关于你希望你的实体如何使用Doctrine。

不需要以下两个:

  
      
  • 将allow_add和allow_delete表单选项设置为true
  •   
  • 将by_reference表单选项设置为false
  •   

它们是关于启用/禁用功能的。你想要它们,所以你需要使用它们。这很明显,但仍然没那么多。

最后一个:

  
      
  • 将集合索引保留在javascript中,以便Doctrine可以跟踪引用
  •   

这是我实际上不理解的那个。但是你需要的是(在你的情况下,因为你正在使用allow_add / delete功能),提供的JavaScript代码将为新行创建HTML或删除现有的HTML。但这也只是复制原型代码。 Symfony的文档中还有一些现成的例子。

答案 1 :(得分:0)

让我以更简单的方式回答自己:

  • 不,我没有忘记任何事情
  • 不,我们不能做得更简单

@dragoste answer

中解释了一些原因