Как получить значение для следующего table_id_seq (primary_key) в доктрине? - PullRequest
2 голосов
/ 01 апреля 2019

Я работаю над проектом в Symfony 4, а база данных находится в postgresql. Существует два метода обновления базы данных:

Метод 1. через скрипт на python с простыми вставками sql

Метод 2. через формы Symfony

Оба эти метода записывают в одну и ту же таблицу.

Сценарий A:

Метод 2. добавляет строку в таблицу, используя форму Symfony (pid - 1)

Метод 1. использует скрипт Python для добавления 500 строк (последовательность pid достигает 501)

Метод 2. Другой пользователь пытается добавить строку, а доктрина пытается вставить с pid = 2, но это должно быть "502"

Я пытался использовать GeneratedValue (стратегии = "AUTO") и "IDENTITY" в определении сущности, но это не решает проблему

/ * Определение класса сущности для поля * /

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

/ * Обработчик представления формы * /

$form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()){
            $data =$form->getData();
            $property = new Property();
            $property->setTitle($data['title']);
            $property->setDescription($data['description']);
            $property->setPrice($data['price']);

            $em->persist($property);
            $em->flush();

           return $this->redirectToRoute('property');
    }

Возможные решения

  • Определите поле в классе сущности таким образом, чтобы оно автоматически получило следующее значение auto_increment

  • Получите следующее значение auto_increment перед вставкой из формы

  • Замените postgresql на mysql (если это поможет)

  • Заменить auto_increment на UUID

Пожалуйста, предложите, какое решение лучше использовать, если оно существует

1 Ответ

1 голос
/ 07 апреля 2019

Глядя на ваш класс сущности, я думаю, что объявление не является полным для установки автоматического значения для id из таблицы последовательности.Попробуйте это объявление вместо.У меня это сработало

/**
 * @ORM\Id()
 * @ORM\Column(type="integer", options={"default"="nextval('property_id_seq'::regclass)"})
 * @ORM\GeneratedValue(strategy="SEQUENCE")
 */
private $id;

Удалить существующую таблицу и обновить схему из bin / console

...