Я пытаюсь сделать объект для 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")
сформировать вашу сущность и вставить запись в вашу организацию