Не могу заставить форму Доктрины работать в Zend 2

Я пытаюсь понять, как использовать аннотации в Zend вместе с гидраторами и строителями Доктрины, и не могу понять, где что-то идет не так. У меня настроены две сущности, одна называется «Списки», а другая — «Типы списков». Listtypes определяет тип списка (позволяет создавать списки по категориям). Первоначально я пытался использовать аннотацию «ComposedObject», но решил, что лучше использовать аннотации в объекте Listype для добавления / редактирования этих элементов, а не в качестве средства получения списка выбора для формы «Списки» в качестве набора полей. Поэтому я попытался поиграть как с набором полей, так и сейчас я просто исключаю и ListtypeId (referencedColumnName) и listtype (объект из отношения ManyToOne) в аннотациях и добавляю селектор вручную после того, как Doctrine FormBuilder создает форму из другие поля:

    $list = new \Application\Entity\Lists();

$builder = new \DoctrineORMModule\Form\Annotation\AnnotationBuilder( $this->getEntityManager());
$form = $builder->createForm( $list );
$form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($this->getEntityManager(),'Application\Entity\Lists'));

$form->add(
array(
'name' => 'ListtypeId',
'type' => 'DoctrineORMModule\Form\Element\DoctrineEntity',
'options' => array(
'label'          => 'Select List Type',
'object_manager' => $this->getEntityManager(),
'target_class'   => 'Application\Entity\Listtypes',
'property'       => 'ListtypeId',
'label_generator' => function($targetEntity) {
return $targetEntity->getListtypeId() . ' - ' . $targetEntity->getListtypeName();
},
'display_empty_item' => true,
'empty_item_label'   => '---',
'find_method' => array(
'name'   => 'findBy',
'params' => array(
'criteria' => array(),
'orderBy'  => array('ListtypeId' => 'ASC'),
),
),
'attributes' => array(
'required' => 'required'
)
),
)
);

У меня все это работает отлично, и я думаю, что понимаю, что он делает. Это пытается сохранить результат, который дает мне припадки сейчас. У меня есть этот селектор, возвращающий ListtypeId, очевидно, поэтому я получаю два соответствующих параметра, возвращая ListName и ListtypeId:

    $form->bind($list);

if ($this->request->isPost()) {
$data['ListName'] = $this->request->getPost('ListName');
$data['ListtypeId'] = intval($this->request->getPost('ListtypeId'));

$listId = $this->request->getPost('ListId');
if((intval($listId) > 0) && ($listId != $list->getId())) {
$data['ListId'] =  $this->request->getPost('ListId');
}

$form->setData($data);
//$this->getDefMapper()->setListtype($list,$Listtype['ListtypeId']);

if ($form->isValid()) {
$this->getDefMapper()->getEntityManager()->persist($list);
$this->getDefMapper()->getEntityManager()->flush();
}
}

Результатом этого является массив, который включает в себя имя, которое я набрал, и идентификатор селектора. Все выглядит хорошо. Поэтому я делаю $ form-> setData ($ data); — без ошибок, и глядя на объект $ list, Name установлено и ListtypeId установлен, но гидратор не создал объект для свойства $ listtype (я думал, что это должно было быть сделано — нужно ли мне также устанавливать ключ для «listtype» или установить его самостоятельно, например, с закомментированной строкой кода?)

Теперь, что заставляет меня чесать голову, так это то, что, как я уже сказал, ListtypeId имеет значение ‘2’ в экземпляре $ list, когда я проверяю код в xdebug перед сохранением. Но когда продолжаются пожары, я получаю следующее:

An error occurred
An error occurred during execution; please try again later.
Additional information:
Doctrine\DBAL\Exception\NotNullConstraintViolationException
File:
R:\TheWild\ZF2Skel\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\AbstractMySQLDriver.php:112
Message:
An exception occurred while executing 'INSERT INTO Lists (ListtypeId, ListName) VALUES (?, ?)' with params [null, "hoodoo"]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'ListtypeId' cannot be null

Что я хочу знать, почему? Кажется, он установлен, когда вызывается постоянный вызов.

0

Решение

Похоже, вы пытаетесь создать записи в вашей базе данных с определенным ListtypeId что вы установили вручную.

Сообщение ясно:

Сообщение:
Возникла исключительная ситуация при выполнении ‘INSERT INTO Lists (ListtypeId, ListName) VALUES (?,?)’ С параметрами [null, «hoodoo»]:

Значение ListtypeId является null, это потому, что Doctrine игнорирует его и продолжает генерировать ID для вашей сущности, как всегда.

Таким образом, вам нужно установить идентификатор вашей организации, прежде чем позвонить persist метод, а также изменить generator strategy, Просто добавьте этот код, он должен работать:

if ($form->isValid()) {
$list->setListtypeId($data['ListtypeId']);
$em->getClassMetaData(get_class($list))
->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());

$this->getDefMapper()->getEntityManager()->persist($list);
$this->getDefMapper()->getEntityManager()->flush();
}

Увидеть Принудительно установить идентификационный номер объекта.

Надеюсь, поможет.

0

Другие решения

Других решений пока нет …