我做了一些研究,在阅读了这个和这个(以及所有相关问题)之后,我仍然无法确定在 Symonfy 2 Doctrine 中更新多对多关系的正确方法。感觉应该有一个很简单的方法,我还没有找到。
我有这两个实体:
class student_main
{
/**
* @ORM\ManyToMany(targetEntity="support_log", inversedBy="student_main")
* @ORM\JoinTable(name="support_log_student")
**/
private $support_log;
和
class support_log
{
/**
* @ORM\ManyToMany(targetEntity="student_main", mappedBy="support_log")
**/
private $student;
我想从support_log
. 在控制器中,在更新操作中,我有类似的东西:
if ($editForm->isValid()) {
//add the relationship the user added
foreach($students as $student){
if(!$em->getRepository('mybundle:student_main')->hasSupportLog($entity,$student)){
$entity->addstudent_main($student);//*
}
}
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('support_log_edit', array('id' => $id)));
}
当然,正如教义文档所说,我相应地更改了该函数(addstudent_main):
public function addstudent_main(student_main $student)
{
$student->addsupport_log($this); // the important addition
$this->student[] = $student;
}
这很好用,我的问题更多是关于删除关系。在表单中有一个多选,用户可能会选择一些已经相关的学生和一些不相关的学生。感觉应该有一种自动的方式来做到这一点,但我不得不做很多代码。
在控制器中,略高于我之前编写的代码,我输入:
//delete all old relationship
foreach($idsldstudents as $idst){ //I take Id's because the doctrine collection is updating always..
$stu=$em->getRepository('MyBundle:student_main')->find($idst);
$stu->deletesupport_log($entity);//I had to create that method (in the entity, I do "$this->support_log->removeElement($support_log)")
$em->persist($stu);
$em->flush();
}
我删除了相关实体的所有关系(当然,要注意这是双向关系,所以必须先在另一边删除它),然后添加用户选择的关系。
还有其他方法可以做到这一点,但我还没有找到任何简单的方法。在所有这些中,我都有同样的问题:
- 我需要一直检查关系是否存在
- 我需要获取旧关系(这很困难)并与用户指示的新关系进行比较,并相应地删除或创建
有没有办法自动解决这两个问题?(我有一种强烈的感觉,一定有——也许有更好的关系声明?——这就是我问的原因)。
提前致谢
编辑:我的表单没有什么特别的,我想我什至没有触摸生成的代码。它显示了我想要的多选,Symfony2 的默认设置,你必须使用ctrlkey 来选择多个。这是代码:
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('student')
...
;
}
关键靠这里?