Symfony版本:3.1.3
我有一个如下控制器,
public function studentAddClassAction( $id, Request $request )
{
$em = $this->getDoctrine()->getManager();
$student= new Student();
// new class object and create the form
$classes= $em->getRepository('PIE10Bundle:Classes')->findAll();
$form = $this->createForm(ClassType::class, $classes);
$form->handleRequest($request);
if( $form->isSubmitted() && $form->isValid() )
{
$parent = $form['parent']->getData(); // the parentID
$cName = $form['class']->getData();
$classID= $cName->getId(); // the classID
//insert new row to the student table
$student->setParentId( $parent );
$student->setClassId( $classID );
$student->setUserId( $id );
$em->persist($student);
$em->flush();
$this->addFlash('notice',
'Student Updated');
return $this->redirectToRoute('user_students');
}
// some other code
}
此外,如果我跑,
if( $form->isSubmitted() && $form->isValid() )
{
$parent = $form['parent']->getData(); // the parentID
$cName = $form['class']->getData();
$classID= $cName->getId(); // the classID
echo $parent . ' / ' . $classID . ' / ' . $id;
die;
// ...
它给出了预期值 - 例如17 / 6 / 5
或相关结果正确,这意味着我将所有$parent
,$classID
和$id
放入{{1条件
但是当我尝试使用
插入它们时if( $form->isSubmitted() && $form->isValid() )
它在
中存储如下所示的行classId 和 userId 列的 NULL 值,但它只设置 parentId ,并且setter方法如下在学生实体
中$student->setParentId( $parent );
$student->setClassId( $classID );
$student->setUserId( $id );
$em->persist($student);
$em->flush();
这对我来说有点奇怪,想要解决这个问题。如果需要任何其他开发者信息,请告诉我。
由于
更新
public function setParentId($parentId)
{
$this->parentId = $parentId;
return $this;
}
public function setClassId($classId)
{
$this->classId = $classId;
return $this;
}
public function setUserId($userId)
{
$this->userId = $userId;
return $this;
}
答案 0 :(得分:7)
为什么要为实体分配ID? 使用ORM(任何,不仅是Doctrine),你不应该使用ID,而是使用对象和模型。
所以,不要编码
$student->setParentId( $parent );
$student->setClassId( $classID );
$student->setUserId( $id );
相反,你应该做
$student->setParent($parent);
$student->setClass($class);
$student->setUser($user);
$parent
,$class
和$users
相关实体的位置。如果映射正确,那么它将被正确保存。
此外,它显然是对Symfony Form的滥用。如果您只想将学生添加到课堂,则不应该坚持学生的新对象。当您$form->submit()
时,将为班级的ArrayCollection
学生添加一个新的学生实例(您愿意添加),然后persist()
将保留该班级,并且(如果您也添加cascade="persist"
)所有用户。