我有多个照片的实体:
/**
* 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。我不知道我在这里想念的是什么。
答案 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);
}