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 值为 classId 和 userId 列,但它仅设置 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"
)所有用户。
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 值为 classId 和 userId 列,但它仅设置 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"
)所有用户。