Symfony 3:Doctrine在数据库中存储NULL值

时间:2016-09-20 06:55:13

标签: php doctrine-orm symfony symfony-forms

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() )

它在

中存储如下所示的行

enter image description here

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;
}

1 个答案:

答案 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")所有用户。