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

Symfony 3: Doctrine stores NULL values in database

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 放入 if( $form->isSubmitted() && $form->isValid() ) 条件

但是当我尝试使用

插入它们时
$student->setParentId( $parent );
$student->setClassId( $classID );
$student->setUserId( $id );

$em->persist($student);
$em->flush();

它将如下行存储在

NULL 值为 classIduserId 列,但它仅设置 parentId 和 setter 方法在 Student entity

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

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

谢谢

更新

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;

为什么要为实体分配 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 的滥用。如果你只想添加一个学生到class,你不应该持久化一个学生的新对象。当你制作 $form->submit() 时,class 的 ArrayCollection 个学生将添加一个新的学生实例(你愿意添加),然后 persist() 将持续存在class,以及(如果您添加 cascade="persist")所有用户。