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

map*_*ith 0 php symfony-forms symfony doctrine-orm

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
}
Run Code Online (Sandbox Code Playgroud)

如果我跑了,

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;
    // ...
Run Code Online (Sandbox Code Playgroud)

它给出了预期值 - 17 / 6 / 5正确的例子或相关结果,这意味着我得到所有$parent,$classID$id进入if( $form->isSubmitted() && $form->isValid() )条件

但是当我尝试使用它插入它们时,

$student->setParentId( $parent );
$student->setClassId( $classID );
$student->setUserId( $id );

$em->persist($student);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

它存储下面的行如下

在此输入图像描述

NULL为值的classid用户id列,但它只是设置的parentId和setter方法在下面的学生实体

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;
}
Run Code Online (Sandbox Code Playgroud)

这对我来说有点奇怪,想解决这个问题.如果需要任何其他开发者信息,请告诉我.

谢谢

更新

class Student
{
/**
 *
 * @ORM\ManyToOne(targetEntity="Classes", inversedBy="student")
 * @ORM\JoinColumn(name="classId", referencedColumnName="id")
 */
private $classes;

/**
 * Get classes
 *
 * @return \PIE10Bundle\Entity\Classes
 */
public function getClasses()
{
    return $this->classes;
}

/**
 * @ORM\OneToOne(targetEntity="Users", inversedBy="student")
 * @ORM\JoinColumn(name="userId", referencedColumnName="id" )
 */
private $users;

/**
 * @var int
 *
 * @ORM\Column(name="userId", type="integer", nullable=true)
 */
private $userId;

/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer", unique=true)
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\Id
 */
private $id;

/**
 * @var int
 *
 * @ORM\Column(name="parentId", type="integer")
 */
private $parentId;

/**
 * @var int
 *
 * @ORM\Column(name="classId", type="integer", nullable=true)
 */
private $classId;
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 7

为什么要为实体分配ID?使用ORM(任何,不仅是Doctrine),您不应该使用ID,而是使用对象和模型.

所以,不要编码

$student->setParentId( $parent );
$student->setClassId( $classID );
$student->setUserId( $id );
Run Code Online (Sandbox Code Playgroud)

相反,你应该做

$student->setParent($parent);
$student->setClass($class);
$student->setUser($user);
Run Code Online (Sandbox Code Playgroud)

在哪里$parent,$class$users- 相关的实体.如果映射正确,那么它将被正确保留.

此外,它显然是对Symfony Form的滥用.如果您只想将学生添加到课堂,则不应该坚持学生的新对象.当你创建时$form->submit(),将向ArrayCollection学生的班级添加一个新的学生实例(你愿意添加),然后persist()将持久保存该课程,并且(如果你添加cascade="persist")所有用户也是如此.