Я работаю с Symfony2, чтобы создать систему управления в школе. Необходимо зарегистрировать студентов, записывающих свои данные и их представителей (которые могут быть родителями). В следующей ссылке вы можете увидеть код, который я использовал для него.
смотрите здесь (уже решена проблема, указанная в ссылке)
Но у меня есть проблема, которую я не могу решить. Второе обвинение должно быть обязательным, поскольку у ученика может быть только один ответственный. С помощью этого кода, если я оставляю пустые данные от второго ответственного, создается новая ответственность со всеми нулевыми данными в базе данных, и новый студент ссылается на него. Мне нужно, чтобы новый ученик сохранил ссылку первого ответственного, а второй – ноль, а второй ответственный не был создан.
Теперь я объясню пример структуры базы данных, которая у меня есть и что я получаю:
Таблица учеников в базе данных
ID NAME SURNAMES ..... RESPONSIBLE_1 RESPONSIBLE_2 1 .... 2 .... 3 name_student surnames ... 5 6
Ответственная таблица в базе данных
ID NAME SURNAMES ..... 1 .... 2 .... 3 .... 4 .... 5 name surnames date .... 6 NULL NULL NULL NULL NULL NULL ....
Как вы можете видеть в примере, учащийся содержит ссылку ответственных, но второй заряд равен нулю. Вместо этого я получаю следующее:
Таблица учеников в базе данных
ID NAME SURNAMES ..... RESPONSIBLE_1 RESPONSIBLE_2 1 .... 2 .... 3 name_student surnames ... 5 NULL
Ответственная таблица в базе данных
ID NAME SURNAMES ..... 1 .... 2 .... 3 .... 4 .... 5 name surnames date ....
Я попробовал добавить в объект студента nullable=false
:
/** * * @ORM\ManyToOne(targetEntity="Parents", inversedBy="students", cascade={"persist"}) * @ORM\JoinColumn(name="responsible2_id", referencedColumnName="id", nullable=false) * @Assert\Valid */ private $responsible2;
И я получаю эту ошибку:
Catchable Fatal Error: Method School\BackendBundle\Entity\Parents::__toString() must return a string value in /opt/lampp/htdocs/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/ORMInvalidArgumentException.php line 199
Я изменил функцию __toString () в объекте Parents:
public function __toString() { if(is_null($this->getName())) { return 'NULL'; } return $this->getName(); }
В конце концов, он все еще удерживает второй ответ, если я оставлю его пустым.
Контроллер, используемый в этом случае, находится по ссылке. Ниже я покажу исправление:
StudentController.php
/** * Creates a new Student entity. * */ public function createAction(Request $request) { $entity = new Student(); $form = $this->createCreateForm($entity); $form->handleRequest($request); if ($form->isValid()) { $responsible1 = $em->getRepository('BackendBundle:Parents')->findResponsible($entity->getResponsible1()->getNid()); $responsible2 = $em->getRepository('BackendBundle:Parents')->findResponsible($entity->getResponsible2()->getNid()); if($responsible1){ $entity->setResponsible1($responsible1); } if($responsible2){ $entity->setResponsible2($responsible2); } //This test conditions if($entity->getResponsible2()->getNid() == "" ) { $entity->setResponsible2($entity->getResponsible1()); } //Select values for other fields. $entity->getResponsible1()->setUsername($entity->getResponsible1()->getNid()); $entity->getResponsible2()->setUsername($entity->getResponsible2()->getNid()); $entity->getResponsible1()->setPassword($entity->getResponsible1()->getNid()); $entity->getResponsible2()->setPassword($entity->getResponsible2()->getNid()); $em = $this->getDoctrine()->getManager(); $em->persist($entity); $em->flush(); return $this->redirect($this->generateUrl('student_show', array('id' => $entity->getId()))); } return $this->render('BackendBundle:Student:new.html.twig', array( 'entity' => $entity, 'form' => $form->createView(), )); }
Хотя у меня нет решения проблемы, я добавил условие проверки. В этом случае, когда второй ответственный является нулевым, что заставляет условие присваивать идентификатор первого ответственного ко второму, так что оба они одинаковы. Будучи Parents form
встроенной в Students form
, я не знаю, как я могу остановиться, если второй ответственный null не будет сохранен, а затем не будет сохранен в базе данных. Я не знаю, является ли проблема чем-то в этом или нет.
Я начинаю с этого, поэтому мне нужна ваша помощь любезно, спасибо.