代码之家  ›  专栏  ›  技术社区  ›  gmazzotti

symfony表单集合类型,按ID索引

  •  0
  • gmazzotti  · 技术社区  · 6 年前

    我正在为一个RESTAPI开发一个带有嵌入式类型的symfony 4表单。形式:

    class OffertaType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('pulsanti_social_attivi', CheckboxType::class, [ ])
                ->add('immagini', CollectionType::class, [
                    'entry_type' => OffertaImmagineType::class,
                    'allow_add' => true,
                    'allow_delete' => true,
                    'by_reference' => false,
                    'prototype' => 'immagini'
                ]);
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(
                [
                    'data_class'         => Offerta::class,
                    'allow_extra_fields' => true,
                    'csrf_protection'    => false,
                ]
            );
        }
    }
    

    集合包含2个对象

    [
        {
            "id": 1,
            "url": "https://via.placeholder.com/150?text=1"
        },
        {
            "id": 2,
            "url": "https://via.placeholder.com/150?text=2"
        }
    ]
    

    所有的“工作”,如果我发布一些数据,一个新的对象被创建,如果我更新一个对象,数据库被更新。奇怪的是,行的更新/删除似乎基于集合中的对象位置,而不是其ID。如果我删除第一个对象,结果应该是

    [
        {
            "id": 2,
            "url": "https://via.placeholder.com/150?text=2"
        }
    ]
    

    但其

    [
        {
            "id": 1,
            "url": "https://via.placeholder.com/150?text=2"
        }
    ]
    

    symfony只看到一个对象,所以删除第二个对象并更新第一个“url”字段。

    如何按对象的ID而不是其位置“索引”集合?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Majesty    6 年前

    不幸的是,这实际上是不可能的。只需接受symfony集合是基于索引的,并处理它。您可以选择其中一个可能的解决方案。

    例如,可以为集合项创建单独的“删除”按钮,然后设置

    'delete_empty' => false,
    'allow_delete' => false,
    

    只用于添加新条目。

    或者你可以设定 delete_empty allow_delete 为true,但在这种情况下,应为要实际删除的集合位置设置空元素。

    另一种选择是根据您的特定要求为表单创建一个唯一的处理程序,但是我不能给您一个特定的示例,因为我不知道您目前需要什么。