Доктрина: явное указание значения первичного ключа без изменения автоматического приращения - PullRequest
1 голос
/ 29 марта 2019

Существует таблица с множеством столбцов и столбцом первичного ключа 'id', имеющим атрибут автоинкремента. База данных mySQL.

Существует два вида кода PHP, которые вставляются в этот столбец. 1.) Обычные запросы вставки создаются в виде строки и выполняются путем подключения ADO к базе данных. В этом случае значение первичного ключа не указывается, поэтому в нем используется значение автоинкремента таблицы.

2.) Существует класс сущностей доктрины php symfony с основным полем, объявленным как

/**
     * @var int
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     */
    private $id;

Вставка использует метод персистента менеджера сущностей. Здесь при вставке явно указывается значение идентификатора , что намного больше значения автоинкремента столбца. Вот почему Generation_Type опускается в аннотациях.

Теперь предположим, что текущее значение auto_increment равно 10000. Я хочу, чтобы при выполнении первого сценария следующий идентификатор принимался за 1001, что ожидается. Но в случае выполнения второго сценария с явным id = 2000, он вставляет запись с 2000, но не изменяет auto_increment на 2000. Он все равно должен оставаться на 1001.

Нужно ли вносить изменения в этот фрагмент кода?

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

Заранее спасибо.

1 Ответ

0 голосов
/ 29 марта 2019

Если вам не нужно, чтобы ваша доктринальная сущность когда-либо использовала стратегию AUTO для установки значения Id, вы должны просто иметь возможность использовать стратегию NONE

/**
 * @ORM\Column(type="integer")
 * @ORM\Id()
 * @ORM\GeneratedValue(strategy="NONE")
 */
private $id;

Больше информации оДоступные стратегии можно найти здесь: https://www.doctrine -project.org / projects / doctrine-orm / en / 2.6 / reference / basic-mapping.html # identifier-generation-стратегии

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

$metadata = $entityManager->getClassMetadata(get_class($entity));
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$em->persist($entity);
$em->flush();

Общий отказ от ответственности: действуйте с осторожностью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...