0

我正在使用来自 http://bootstrap.braincrafted.com/的 BootstrapCollection 和 VichUploader https://github.com/dustin10/VichUploaderBundle

除了删除功能外,它工作正常。如果我尝试删除一个子项(PDF 文件),则只有 name 属性为空,但不会删除整行/实体。

父表单类型:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'files',
            BootstrapCollectionType::class,
            [
                'type'               => NewsPdfFileType::class,
                'required'           => false,
                'allow_add'          => true,
                'allow_delete'       => true,
                'label'              => 'PDF',
                'translation_domain' => 'entities',
            ]
        );
    }

子窗体类型:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'pdfFile',
                VichFileType::class,
                [
                    'required'      => false,
                    'download_link' => true,
                    'allow_delete'  => true,
                    'label'         => 'PDF'
                ]
            );

    }

这是我的关系:

父实体 NewsPdf:

class NewsPdf
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="Brightside\CMSBundle\Entity\News")
     */
    private $news;

    /**
     * @ORM\OneToMany(targetEntity="Mandant\CMSPlusBundle\Entity\NewsPdfFile", mappedBy="newsPdf", cascade={"persist"})
     */
    private $files;
.
.
.
.

子实体 NewsPdfFile:

class NewsPdfFile
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Mandant\CMSPlusBundle\Entity\NewsPdf", inversedBy="files")
     * @JoinColumn(name="newsPdf_id", referencedColumnName="id")
     */
    private $newsPdf;

    /**
     * @var File
     *
     * @Vich\UploadableField(mapping="news_pdf", fileNameProperty="pdfName")
     *
     */
    private $pdfFile;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     *
     * @var string
     */
    private $pdfName;

    /**
     * @ORM\Column(type="datetime")
     *
     * @var \DateTime
     */
    private $updatedAt;
.
.
.

在我的父实体中,我已经有一个删除功能:

/**
     * @param NewsPdfFile $file
     */
    public function removeFile(NewsPdfFile $file)
    {
        $this->files->removeElement($file);
    }

但我无法让它工作。当我尝试删除元素时(在我的 formType 中有 allow_delete 选项)只有“pdfName”属性将为空。我究竟做错了什么?

4

1 回答 1

0

我自己找到了灵魂:

Symfony 不会从集合中删除实体

我需要更改父实体中的删除功能:

    /**
     * @param NewsPdfFile $file
     */
    public function removeFile(NewsPdfFile $file)
    {
        $this->files->removeElement($file);
        $file->setPdfFile(null);
    }

和 OneToMany 注释中的 orphanRemoval=true :

    /**
     * @ORM\OneToMany(targetEntity="Mandant\CMSPlusBundle\Entity\NewsPdfFile", mappedBy="newsPdf", cascade={"persist"}, orphanRemoval=true)
     */
    private $files;
于 2016-12-16T11:14:26.550 回答