背景信息的Symfony2 + Doctrine2:实体去除效果集合
我有一个名为年报与多个集合的实体(假设2为简洁的缘故)。的这些集合的一个排在FormType自动处理:
//AnnualReportStaffing entity collection
->add('staffingTenured', 'collection', array(
'type' => new AnnualReportStaffingType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
))
的其他集合是文件和删除的集合不是自动处理:
//AnnualReportDetail entity collection
->add('documents', 'collection', array(
'type' => new AnnualReportDocumentType(),
'allow_add' => true,
'allow_delete' => false, // Do NOT automatically remove documents not in the collection (i.e. edit form where Documents are not passed again)
'by_reference' => false,
))
这是我的AnnualReport实体类中每个集合的属性/方法声明:
/**
* @ORM\ManyToMany(targetEntity="AnnualReportStaffing", cascade={"persist", "detach", "remove"}, orphanRemoval=true, fetch="LAZY")
* @ORM\JoinTable(name="annualreports_staffingtenure",
* joinColumns={@ORM\JoinColumn(name="annualreport_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="staffing_id", referencedColumnName="id", onDelete="CASCADE")},
* )
*/
private $staffingTenured;
/**
* @ORM\ManyToMany(targetEntity="Document", cascade={"persist", "detach", "remove"}, orphanRemoval=true, fetch="LAZY")
* @ORM\JoinTable(name="annualreports_documents",
* joinColumns={@ORM\JoinColumn(name="annualreport_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="document_id", referencedColumnName="id", onDelete="CASCADE")},
* )
*/
private $documents;
public function __construct(AnnualReportUnit $unit, $year) {
$this->staffingTenured = new ArrayCollection();
$this->documents = new ArrayCollection();
}
/**
* Add staffingTenured
*
* @param AppBundle\Entity\AnnualReportStaffing $staffing
* @return AnnualReport
*/
public function addStaffingTenured(AnnualReportStaffing $staffing)
{
$this->staffingTenured->add($staffing);
return $this;
}
/**
* Remove staffingTenured
*
* @param AppBundle\Entity\AnnualReportStaffing $staffing
* @return AnnualReport
*/
public function removeStaffingTenured(AnnualReportStaffing $staffing)
{
$this->staffingTenured->removeElement($staffing);
return $this;
}
/**
* Get staffingTenured
*
* @return ArrayCollection
*/
public function getStaffingTenured()
{
return $this->staffingTenured;
}
/**
* Add document
*
* @param AppBundle\Entity\AnnualReportDocument $document
* @return AnnualReport
*/
public function addDocument(AnnualReportDocument $document)
{
$this->documents->add($document);
return $this;
}
/**
* Remove document
*
* @param AppBundle\Entity\AnnualReportDocument $document
* @return AnnualReport
*/
public function removeDocument(AnnualReportDocument $document)
{
$this->documents->removeElement($document);
return $this;
}
/**
* Get documents
*
* @return ArrayCollection
*/
public function getDocuments()
{
return $this->documents;
}
问题
当谈到时间删除年报实体:
- 如果文件存在,我能够删除的文件集合,但我得到了一个外键约束错误员工保险项目。
An exception occurred while executing 'DELETE FROM annual_report WHERE id = ?' with params [57]: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails
(
libcommand
。annualreports_staffingtenure
,约束FK_DB56517AD4F67A27
外键(annualreport_id
)参考文献annual_report
(id
))
- 如果没有文件都存在,年报实体和所有人员配备保密项目按预期被删除。
这是deleteAction():
public function deleteAction(Request $request, $id)
{
$requestData = $request->request->all();
$unit = $requestData['form']['unit'];
$form = $this->createDeleteForm($id);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AppBundle:AnnualReport')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find AnnualReport entity.');
}
//Remove any documents (allow_delete set to FALSE in form so have to do manually)
$documents = $entity->getDocuments();
foreach($documents as $document){
$entity->removeDocument($document);
//$em->remove($document);
}
$em->persist($entity);
$em->flush();
$em->remove($entity);
$em->flush(); //flush again to remove the annual report
}
return $this->redirect($this->generateUrl('annualreportunit_edit', array('id' => $unit)));
}
这是形式和ORM之间的差异的精细解释,但问题是,我使用级联在我的实体映射并正确级联人员配备实体时我也不必手动删除文档实体。只有在这种情况下,它不起作用。 – Ravioli87