Явно установите идентификатор с помощью Doctrine при использовании стратегии «АВТО»

Моя сущность использует эту аннотацию для своего идентификатора:

/**
 * @orm:Id
 * @orm:Column(type="integer")
 * @orm:GeneratedValue(strategy="AUTO")
 */
protected $id;

Из чистой базы данных я импортирую существующие записи из более старой базы данных и пытаюсь сохранить одинаковые идентификаторы. Затем, при добавлении новых записей, я хочу, чтобы MySQL автоматически увеличивал столбец идентификатора, как обычно.

К сожалению, похоже, что Doctrine2 полностью игнорирует указанный идентификатор.


Новое решение

Согласно приведенным ниже рекомендациям, следующее: предпочтительное решение:

$this->em->persist($entity);

$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());

Старое решение

Поскольку Doctrine опирается на ClassMetaData для определения стратегии генератора, его необходимо изменить после управления объектом в EntityManager:

$this->em->persist($entity);

$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);

$this->em->flush();

Я только что протестировал это на MySQL, и он работал как ожидается, что означает, что сущности с настраиваемым идентификатором были сохранены с этим идентификатором, в то время как те, у кого не указан идентификатор, использовали lastGeneratedId () + 1 .

94
задан Nickolaus 29 September 2016 в 10:08
поделиться