以symfony形式添加和删除实体

时间:2017-04-05 15:16:30

标签: php forms symfony doctrine-orm

我有一个Doctrine实体Document,它与实体File具有双向oneToMany关系。因此,一个文档可以有许多文件实体。

现在我想创建一个symfony表单,我可以在其中添加和删除文档中的文件。我通过CollectionType设置了DocumentType中包含的FileType:

//DocumentType.php
$builder->add('files', Type\CollectionType::class, ['entry_type' => FileType::class])

//FileType.php
$builder->add('id', Type\HiddenType::class);

这样我就得到了带有file-id的隐藏字段。我现在想要通过JS禁用字段,如果应该从文档中删除文件。但是我无法发送表单,因为我收到了错误:

Could not determine access type for property "id".

这只是因为我想使用Field的id。当然,我可以使用src或File的任何其他列来标识要删除的正确实体。

但我希望,在symfony中有一个更好的方法可以解决这个问题吗?

这是我的实体映射:

AppBundle\Entity\File:
    type: entity
    table: files
    repositoryClass: AppBundle\Repository\FileRepository
    manyToOne:
        document:
            targetEntity: Document
            inversedBy: files
            joinColumn:
                onDelete: CASCADE
AppBundle\Entity\Document:
    type: entity
    table: documents
    repositoryClass: AppBundle\Repository\DocumentRepository
    oneToMany:
        files:
            targetEntity: File
            mappedBy: document

1 个答案:

答案 0 :(得分:0)

这不是Symfony问题,您的File实体没有任何方法来设置id属性的值。当Symfony构建数据映射器尝试使用File将提交的ID映射到PropertyAccessor实体时,会出现此错误。

还有一件事,如果你想允许你的收藏添加/删除条目,选项allow_add / allow_delete必须是true。您不需要向FileType添加任何标识字段,Symfony表单通过索引处理它,我猜...

// DocumentType.php
$builder->add('files', Type\CollectionType::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', Type\TextType::class)
    ->add('description', Type\TextareaType::class)
;