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

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

Способ 1. через скрипт Python с простыми вставками sql

Способ 2. через формы symfony

Оба этих метода пишут в одну и ту же таблицу.

Сценарий А:

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

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

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

Я пытался использовать GeneratedValue(strategy="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

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

AUTO должен использовать последовательности PostgreSQL, и это на стороне сервера. Я не понимаю, как вы могли по-прежнему получать конфликты, используя эту стратегию. Может попробовать заставить @GeneratedValue(strategy = "SEQUENCE"). Обратите внимание, что по умолчанию Doctrine создает последовательность, которая увеличивается на 10, поэтому у вас будут большие промежутки со вставками, выполненными клиентами, отличными от Doctrine.

Łukasz Kamiński 01.04.2019 16:02

@ ŁukaszKamiński Я пробовал это, и это все еще не решает проблему. Сценарий обновляет базу данных раз в два дня, и форма доступна в любое время. Таким образом, сценарий и форма также должны обновляться одновременно. Сценарий добавляет около 1000 строк каждый раз, когда он запускается.

shovan rai 01.04.2019 18:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
316
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Удалите существующую таблицу и обновите схему из корзины/консоли.

Другие вопросы по теме