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
技巧,我有一个反向关系,在删除元素时遇到了问题。有了这个,我不需要迭代每个元素并在控制器中移除它。