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)
为什么要为实体分配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")所有用户也是如此.
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |