我有一个教义实体文档,它与实体文件具有双向 oneToMany 关系。因此,一个文档可以有多个文件实体。
现在我想制作一个symfony表单,我可以在其中添加和删除文档中的文件。我通过 CollectionType 设置了一个包含在 DocumentType 中的文件类型:
//DocumentType.php
$builder->add('files', TypeCollectionType::class, ['entry_type' => FileType::class])
//FileType.php
$builder->add('id', TypeHiddenType::class);
这样我就会得到带有文件 ID 的隐藏字段。如果应该从文档中删除文件,我现在想通过 JS 禁用字段。但是我无法发送表单,因为我收到错误:
Could not determine access type for property "id".
这只是因为我想使用字段的 id。当然,我可以使用 src 或文件的任何其他列来识别要删除的正确实体。
但我希望,在symfony中有一个整体上更好的方法来处理这个问题?
这是我的实体映射:
AppBundleEntityFile:
type: entity
table: files
repositoryClass: AppBundleRepositoryFileRepository
manyToOne:
document:
targetEntity: Document
inversedBy: files
joinColumn:
onDelete: CASCADE
AppBundleEntityDocument:
type: entity
table: documents
repositoryClass: AppBundleRepositoryDocumentRepository
oneToMany:
files:
targetEntity: File
mappedBy: document
这不是Symfony的问题,你的File
实体没有任何方法来设置id
属性的值。当Symfony的表单数据映射器尝试使用PropertyAccessor
将提交的ID映射到您的File
实体时会导致错误。
还有一件事,如果要允许集合添加/删除条目,则必须true
选项allow_add
/allow_delete
。你不需要在你的FileType
中添加任何标识字段,Symfony表单通过索引来处理它,我猜。
// DocumentType.php
$builder->add('files', TypeCollectionType::class, [
'entry_type' => FileType::class,
'allow_add' => true,
'allow_delete' => true
]);
// FileType.php
// Add fields you want to show up to end-user to edit.
$builder
->add('name', TypeTextType::class)
->add('description', TypeTextareaType::class)
;