Php Symfony CollectionType表示删除+;作为项的修改而创建
我有一个SymfonyPhp Symfony CollectionType表示删除+;作为项的修改而创建,php,forms,doctrine-orm,symfony,Php,Forms,Doctrine Orm,Symfony,我有一个SymfonyOrderType表单附加到一个订单对象。此Order对象具有一个items属性,该属性包含OrderItem对象的ArrayCollection。这些OrderItem对象都包含product和quantity属性。product属性链接到product对象。每个OrderItem都与一个OrderItemType相关联,该OrderItemType是与Order项目属性关联的CollectionType的一部分 长话短说,下面是代码(非常简化,属性最少,没有条令注释):
OrderType
表单附加到一个订单
对象。此Order
对象具有一个items
属性,该属性包含OrderItem
对象的ArrayCollection
。这些OrderItem
对象都包含product
和quantity
属性。product
属性链接到product
对象。每个OrderItem
都与一个OrderItemType
相关联,该OrderItemType
是与Order
项目属性关联的CollectionType
的一部分
长话短说,下面是代码(非常简化,属性最少,没有条令注释):
请注意,基本上一切正常,我不会在代码中查找错误:)
订单类
订单项目类
订单
订购项目表格
当然,用户可以按照创建、编辑和删除行的顺序添加和删除行。几乎
如果我删除订单的最后一行并创建新行,Symfony认为新行实际上是旧行的修改。当然,Symfony没有办法知道这条线不是旧的
因此,我在我的OrderItemType
中添加了一个id
字段。当然,Symfony无法在提交时设置id
,因为OrderItem
中没有setId
方法(这很正常,因为手动设置对象的id
是个坏主意)
那就是我被困的地方。我想我可以将id
字段设置为mapped:false
,并在控制器上实现自定义逻辑,以清除在其id
未出现在发布值中时删除的旧项目,并为具有空id
的项目创建新的OrderItem
,但对我来说,这似乎是一个丑陋的黑客行为,我想知道我是否完全遗漏了一些东西,因为这看起来是一个非常基本的问题
那么Symfony是否有一种内置的方法来识别CollectionType
表单中删除+创建和编辑之间的差异呢?我完全错过了什么吗?蛋糕是谎言吗
编辑
我知道我的代码不完整,但我想专注于手头的问题。换言之:
OrderItem
。但我希望Symfony删除OrderItem
#2并创建一个ID为3的新OrderItem
我希望这更清楚一点。我知道您还没有添加条令注释,但它与您描述的Id问题有关。通常您会自动生成一个ID,因此没有“setter”,但有一个“getter” 所以你会有这样的想法:
class OrderItem {
...
/**
* @ORM\Id
* @ORM\Column(name="order_item_id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $order_item_id;
是的,您的$quantity值应该是一个“int”,但这并不重要。我只是想让你知道你不能有半个数量。我知道你还没有添加你的条令注释,但这与你描述的Id问题有关。通常您会自动生成一个ID,因此没有“setter”,但有一个“getter” 所以你会有这样的想法:
class OrderItem {
...
/**
* @ORM\Id
* @ORM\Column(name="order_item_id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $order_item_id;
是的,您的$quantity值应该是一个“int”,但这并不重要。我只是想让你知道你不能有半个数量。注意:你有
private$quantity;//浮动
,但数量“不能”是浮动!!!好的,现在这是一个int
。我可以把它做成一个字符串
或数组
,这不会改变我的问题,对吗?这很旧,但谷歌把我带到了这里;可能也会帮助其他人。解决方案是索引关联,请参见备注:您有private$quantity;//浮动
,但数量“不能”是浮动!!!好的,现在这是一个int
。我可以把它做成一个字符串
或数组
,这不会改变我的问题,对吗?这很旧,但谷歌把我带到了这里;可能也会帮助其他人。解决方案是索引关联,请参见抱歉,但与此无关。我的代码有几千行,已经运行了4个月了(除了我问题中的问题)。我只是写了这个非常简化的版本来回答这个问题。添加id
字段似乎是对CollectionType
字段的错误使用。您没有显示足够的代码供任何人给出正确答案。你可能想重新提出一个经过深思熟虑的不同问题。我只是想帮你。另外,如果您的代码有数千行,那么它似乎不符合Symfony MVC最佳实践。我在编辑我的问题时重新解释了我的问题。我希望这能更好地解释。对不起,这与此无关。我的代码有几千行,已经运行了4个月了(除了我问题中的问题)。我只是写了这个非常简化的版本来回答这个问题。添加id
字段似乎是对CollectionType
字段的错误使用。您没有显示足够的代码供任何人给出正确答案。你可能想重新提出一个经过深思熟虑的不同问题。我只是想帮你。另外,如果您的代码有数千行,那么它似乎不符合
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)
}
}
class OrderItem {
...
/**
* @ORM\Id
* @ORM\Column(name="order_item_id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $order_item_id;