Symfony表单集合不保存参考

时间:2015-04-15 09:52:43

标签: php symfony doctrine-orm

我有多个照片的实体:

/**
 * related images
 * @ORM\OneToMany(targetEntity="Photo", mappedBy="entity",cascade={"persist"})
 * @ORM\OrderBy({"uploaded_at" = "ASC"})
 */
private $photos;

照片与实体

具有ManyToOne关系
    /**
 * @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Entity", inversedBy="photos")
 * @ORM\JoinColumn(name="entity_id", referencedColumnName="id", onDelete="CASCADE")
 */
private $entity;

所有setter和getter都已设置我正在填写symfony收集文档:http://symfony.com/doc/current/reference/forms/types/collection.html

FormType:

             ->add('photos', 'collection', array(
             'type' => new PhotoFormType(),
             'allow_add' => true,
             'by_reference' => false,
             'allow_delete' => true,
             'prototype' => true

         ))

光类型:

        $builder
        ->add('title', null, ['label' => 'front.photo.title', 'required' => true])
        ->add('image', 'file', array('required' => false))
    ;

对于上传我正在使用vichUploadableBundle,图像保存得很好,但是entity_id不保存并且为null。我不知道我在这里想念的是什么。

4 个答案:

答案 0 :(得分:5)

以下是迄今为止最好的解决方案,使用symfony表单组件进行调查或研究。

FormType:

     ->add("photos",'collection', array(
            'type' => new PhotoFormType(),
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false
))

实体类

public function addPhoto(Photo $photo)
{
    $photo->setEntity($this);
    $this->photos->add($photo);        
}

public function removePhoto(Photo $photo)
{
    $this->photos->removeElement($photo);
}

最佳做法是不要使用循环手动绑定引用实体。请记住,by_reference必须为false。比如'by_reference'=>假。

答案 1 :(得分:2)

我也去过这个。我认为主要的问题是,即使主要实体有cascade = {“persist”},孩子在创建新条目时也不会获得ID。 所以我做了什么,这是一种黑客,但工作正常this

// $em->persist($entity);  After persisting entity:
foreach ($entity->getPhotos() as $photo) {
    $photo->setEntity($entity);
}

创建父亲后,基本上会在子项中保留ID。

但另一方面,至少我如何理解主义,如果我错了,请纠正我。尝试添加orphanRemoval / fetch其他属性:

父亲实体

/**
* related images
* @ORM\OneToMany(targetEntity="Photo", mappedBy="entity",cascade={"persist"}, orphanRemoval=true, fetch="EAGER")
* @ORM\OrderBy({"uploaded_at" = "ASC"})

* / 私人$ photos;

答案 2 :(得分:2)

遇到同样的问题,我还记得有更好的解决方案。

您需要在具有集合的实体中指定添加和删除功能。

class Entity
{
    // ...

    public function addPhoto(Photo $photo)
    {
        $this->photos->add($photo);
        $photo->setEntity($this);
    }

    public function removePhoto(Photo $photo)
    {
        $this->photos->removeElement($photo);
    }
}

所以在这种情况下你不需要控制器中的循环。 如果

  

orphanRemoval =真

已设置,删除没有问题。

答案 3 :(得分:0)

照片实体是持久的,所以我添加到控制器处理程序为每个照片实体设置。不知道它是否是正确的解决方案,但它正在发挥作用。

                /** @var Photo $photo */
                foreach ($entity->getPhotos() as $photo){
                    $photo->setEntity($entity);
                    $em->persist($photo);
                }