Php Symfony表单集合未保存引用

Php Symfony表单集合未保存引用,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我有多张照片的实体: /** * related images * @ORM\OneToMany(targetEntity="Photo", mappedBy="entity",cascade={"persist"}) * @ORM\OrderBy({"uploaded_at" = "ASC"}) */ private $photos; 照片与实体有着千丝万缕的联系 /** * @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entit

我有多张照片的实体:

/**
 * related images
 * @ORM\OneToMany(targetEntity="Photo", mappedBy="entity",cascade={"persist"})
 * @ORM\OrderBy({"uploaded_at" = "ASC"})
 */
private $photos;
照片与实体有着千丝万缕的联系

    /**
 * @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Entity", inversedBy="photos")
 * @ORM\JoinColumn(name="entity_id", referencedColumnName="id", onDelete="CASCADE")
 */
private $entity;
所有setter和getter都已设置。我正在翻开symfony系列文档:

表单类型:

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

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

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

对于上传,我使用的是vichUploadableBundle,图像保存得很好,但实体id不保存,并且为空。我不知道我在这里遗漏了什么。

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

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

我也去了。我认为主要的问题是,即使主实体有cascade={“persist”},当您创建一个新条目时,子实体也不会获得ID。 所以我所做的,有点像黑客,但效果很好

基本上,在孩子的父亲被创建后,在孩子中保留ID

但在另一点上,至少我是如何理解教义的,如果我错了,请纠正我。尝试添加删除/获取其他属性:

父实体有:

/**
*相关图片。
*@ORM\OneToMany(targetEntity=“Photo”,mappedBy=“entity”,cascade={“persist”},orphandremovation=true,fetch=“EAGER”)
*@ORM\OrderBy({“上传到”=“ASC”})
*/
私人照片;

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

您需要在具有集合的实体中指定添加和删除函数

class Entity
{
    // ...

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

    public function removePhoto(Photo $photo)
    {
        $this->photos->removeElement($photo);
    }
}
因此,在这种情况下,控制器中不需要循环。 如果

孤立删除=真


已设置,删除没有问题。

以下是迄今为止关于此问题的最佳解决方案,请使用symfony表单组件进行调查或研究

表单类型:

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

         ))
     ->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);
}

最佳实践是不要使用循环手动绑定引用实体。记住,引用必须为false。比如“by_reference”=>false

看起来不错,但我不会在每个循环上都进行持久化,只是在foreach:)后面加一个:$em->flush())谢谢,
by\u reference=>false
行帮了我的忙!可用的最干净的解决方案,无需迭代控制器上的每个元素。请记住,您可能需要在实体类方法removePhoto中添加一个
$photo->setEntity(null)
,以便在编辑时删除照片,在实体类中的照片注释中,
orphaneremovation=true
,我猜您也可以在add方法中执行此操作,而不是遍历所有这些方法。这似乎真的是条令主义应该处理的事情。+1对于
orphandremovation=true
技巧,我有一个反向关系,在删除元素时遇到了问题。有了这个,我不需要迭代每个元素并在控制器中移除它。