【发布时间】:2016-07-12 15:41:10
【问题描述】:
我有一个 Symfony OrderType 表单附加到一个 Order 对象。这个Order 对象有一个items 属性,其中包含OrderItem 对象的ArrayCollection。这些OrderItem 对象每个都包含product 和quantity 属性。 product 属性链接到 Product 对象。每个OrderItem 都与一个OrderItemType 相关联,该CollectionType 是与Order items 属性相关联的一部分。
长话短说,这里是代码(非常简化,具有最少的属性,没有教义注释):
请注意,基本上一切正常,我不是在寻找这段代码中的错误:)
订单类
class Order {
private $id;
private $items;// ArrayCollection of OrderItem
}
订单商品类
class OrderItem {
private $id;
private $product;// Product object
private $quantity;// int
}
订购单
class OrderType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('items', CollectionType::class, array(
'by_reference' => false,
'entry_type' => OrderItemType::class,
'allow_add' => true,
'allow_delete' => true
));
}
}
订单商品表单
class OrderItemType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('product', EntityType::class, array(
'class' => 'AppBundle\Entity\Product',
'choice_label' => 'id'
))
->add('quantity', NumberType::class)
}
}
当然,用户可以按创建、编辑和删除行的顺序添加和删除行。嗯,差不多……
如果我删除订单的最后一行并创建一个新行,Symfony 认为新行实际上是对旧行的修改。当然,Symfony 没有办法知道这条线不是旧的。
所以我在OrderItemType 中添加了一个id 字段。但是当然,Symfony 不能在提交时设置id,因为OrderItem 中没有setId 方法(这很正常,因为手动设置对象的id 是个坏主意)。
这就是我卡住的地方。我想我可以将id 字段设置为mapped: false 并在控制器上实现自定义逻辑,以摆脱在其id 未出现在发布的值中时被删除的旧项目并创建一个新的OrderItem对于具有空 id 的项目,但这对我来说似乎是丑陋的黑客行为,我想知道我是否没有完全遗漏一些东西,因为这看起来像是一个非常基本的问题。
那么 Symfony 是否有一种内置方法来识别 CollectionType 表单中 deletion+creation 和 edition 之间的区别?我完全错过了什么吗?蛋糕是骗人的吗?
编辑
我知道我的代码不完整,但我想专注于手头的问题。换一种说法:
- 用户在订单中为需要 3 个产品 A 和 2 个产品 B 的客户创建了两行。
- 用户保存订单(Symfony 在数据库中创建 ID 为 1 和 2 的 2 个
OrderItem对象) - 客户再次调用,想要 5 个 productC 而不是 2 个 productB。
- 用户删除第 2 行 (2 productB) 并添加新行 (5 productC)。
在这里,Symfony 通过分配新产品 (productC) 和数量 (5) 来更改 ID #2 的 OrderItem。但我希望 Symfony 删除 OrderItem #2 并创建一个 ID 为 3 的新 OrderItem。
我希望这更清楚一点。
【问题讨论】:
-
注意:你有
private $quantity;// float,但数量“不能”是浮点数!!! -
好的,现在是
int。我可以将其设为string或array,这不会改变我的问题,对吗? -
这是旧的,但谷歌把我带到了这里;也可以帮助其他人。解决方案是索引关联,见stackoverflow.com/questions/64775433/…
标签: php forms doctrine-orm symfony