Php Symfony CollectionType表示删除+;作为项的修改而创建

Php 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的一部分 长话短说,下面是代码(非常简化,属性最少,没有条令注释):

我有一个Symfony
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
表单中删除+创建编辑之间的差异呢?我完全错过了什么吗?蛋糕是谎言吗

编辑 我知道我的代码不完整,但我想专注于手头的问题。换言之:

  • 用户为需要3个productA和2个productB的客户机按顺序创建两行
  • 用户保存订单(Symfony在数据库中创建2个ID为1和2的对象)
  • 客户端再次调用,希望使用5个productC而不是2个productB
  • 用户删除第2行(2 productB)并添加新行(5 productC)
  • 在这里,Symfony通过分配新产品(productC)和数量(5),更改ID为2的
    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;