让我们想象这两个实体:
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_add
和allow_delete
表单选项设置为 true by_reference
表单选项设置为 false andItem()
& removeItem()
功能已在ShoppingCart
ShoppingCart
项目集合中添加/删除Item
之外,设置/取消设置与ShoppingCart
的拥有方关系我忘记了什么吗?
与需求和其他框架/ ORM相比,我觉得这对我来说是一个巨大的痛苦
有没有办法更简单?
答案 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)