Doctrine2 с идентификатором varchar не вставляет идентификатор в базу данных

Я пытаюсь сделать объект для Doctrine2 в приложении ZF2. Мой объект должен иметь id varchar (15), но когда я пытаюсь создать новую строку, doctrine2 не подталкивает этот идентификатор в базу данных.

В классе, сгенерированном сущностью, у меня есть следующее:

/** * Checkpoints * * @ORM\Table(name="checkpoints", uniqueConstraints{@ORM\UniqueConstraint(name="sort", columns={"sort"})}, indexes={@ORM\Index(name="country", columns={"country"})}) * @ORM\Entity */ class Checkpoints { /** * @var string * * @ORM\Column(name="id", type="string", length=15, nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; // rest of the entity... 

Есть ли что-то, что мне нужно изменить, чтобы передать этот идентификатор из формы в базу данных в доктрине?

Doctrine обрабатывает @ORM\GeneratedValue(strategy="Identity") для каждой базы данных. В случае MySql он будет вставлять сгенерированное значение, также известное как AUTO_INCREMENT приводит к integer как идентификатор. Пожалуйста, ознакомьтесь с http://docs.doctrine-project.org/en/2.0.x/reference/basic-mapping.html#identifiers-primary-keys .

В вашем случае вы не должны использовать аннотацию GeneratedValue включая ее стратегию. Так что полностью удалите его. Если вам нужен идентификатор формы, вы можете настроить конструктор в своей сущности, который установит ваш идентификатор для этого объекта.

 class Checkpoints { public function __constructor($id) { $this->id = $id; } /** * @var string * * @ORM\Column(name="id", type="string", length=15, nullable=false) * @ORM\Id */ private $id; // rest of the entity... } 

Обратите внимание: не упоминание аннотации GeneratedValue совпадает с GenerateValue(strategy="None") .

Конечно, вы можете установить свой идентификатор позже после его создания, но каждый экземпляр этого объекта нуждается в идентификаторе, поэтому лучше заставить его установить его своим конструктором.

Поэтому в вашем контроллере вы будете использовать что-то вроде этого

 if ($form->isValid() { $formData = $form->getData(); $checkpoint = new Checkpoints($formData['id']); } 

Как вы упомянули, вы хотели бы установить ID с помощью ввода вашей формы. Но позвольте мне отметить, что пользователь может ввести дубликаты первичных ключей. Чтобы поймать его, вам нужно проверить, существует ли объект, и в этом случае я бы рекомендовал использовать \DoctrineModule\Validator\NoObjectExists . См. https://github.com/doctrine/DoctrineModule/blob/master/docs/validator.md о валидаторах Doctrine.

Поэтому, чтобы проверить, существует ли объект с идентификатором, вы можете добавить этот валидатор в свой входной фильтр вашей формы:

 public function getInputFilterSpecification() { $entityManager = $this->serviceManager->get('Doctrine\ORM\EntityManager'); return array( 'id' => array( 'validators' => array( array( 'name' => 'DoctrineModule\Validator\NoObjectExists', 'options' => array( 'object_repository' => $entityManager->getRepository('Application\Entity\Checkpoints'), 'fields' => 'id' ) ) ) ) ); } 

Итак, теперь мы знаем, что предоставленный ID доступен для нового объекта Checkpoints точек.

Просто удалите строку

 * @ORM\GeneratedValue(strategy="IDENTITY") 

сформировать вашу сущность и вставить запись в вашу организацию