gpt4 book ai didi

Symfony Forms CollectionType,按 ID 索引

转载 作者:行者123 更新时间:2023-12-05 06:28:28 27 4
gpt4 key购买 nike

我正在为 REST API 开发带有嵌入式类型的 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 只看到 1 个对象,所以删除第二个并更新第一个“url”字段。

我如何根据对象的 ID 而不是它们的位置“索引”集合?

最佳答案

在 Symfony 的存储库中有一个打开的票证,用于向 CollectionType 添加一个功能来索引自定义字段上的项目:https://github.com/symfony/symfony/issues/7828这将解决您遇到的问题,但该票证仍未解决且尚未推进。

然而,在线程的更深处,人们通过手动更改实体的 ArrayCollection 以使用 id 对其进行索引来找到解决方法,如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$entity = $builder->getData();

// Reindex collection using id
$indexedCollection = new ArrayCollection();
foreach ($entity->getCollectionField() as $collectionItem) {
$indexedCollection->set($collectionItem->getId(), $collectionItem);
}

$builder
->add('collectionField', CollectionType::class, [
'data' => $indexedCollection,
])
;
}

(从 Seb33300 的回答 https://github.com/symfony/symfony/issues/7828#issuecomment-579608260 复制)。

然后你可以发回这个JSON:

{
"immagini": {
"2": {"url": "http://new-url.com"}
}
}

并且它将映射到集合中 ID 为 2 的实体。

关于Symfony Forms CollectionType,按 ID 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com