Doctine-orm, в сущности уже есть id(uuid) как добавить поле автоинкрементный серийный номер?

Пробовал это руками написать,

$this->addSql('ALTER TABLE service_orders ADD order_number SERIAL UNIQUE');

работает хорошо, а как к этому записать аннотацию не понятно.

 * @ORM\Entity
 * @ORM\Table(name="service_orders")
 */
class Order
{

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

    /**
     * @ORM\Column(type="integer", name="order_number")
     * @ORM\GeneratedValue(strategy="IDENTITY") (пробовал и AUTO, по мане вроде identity подходит)
     */
    private int $orderNumber;
....

делаю diff добавляется это

        $this->addSql('ALTER TABLE service_orders ADD order_number INT NOT NULL');
        $this->addSql('CREATE SEQUENCE service_orders_id_seq');
        $this->addSql('SELECT setval(\'service_orders_id_seq\', (SELECT MAX(id) FROM service_orders))');
        $this->addSql('ALTER TABLE service_orders ALTER id SET DEFAULT nextval(\'service_orders_id_seq\')');

почему-то, начинается работа c id причём тут id, оно уже задано ранее и работает хорошо. Не могу понять как правильно написать аннотацию, чтобы просто добавлялся (автоинкрементный) номер к новой записи.(postgres, symfony5.1) Помогите, спасите!


Ответы (2 шт):

Автор решения: Dmitry Kozlov

Если

поле нужно для сортировки(по возрастанию)

то простое решение "в лоб":

/**
 * @ORM\Column(type="integer", name="order_number")
 */
private int $orderNumber;

public function __construct()
{
    $this->orderNumber = time();
}

Если нужно именно "+1", то можно попробовать (например) использовать Doctrine Extensions Sortable

use Gedmo\Mapping\Annotation as Gedmo;

...

/**
 * @ORM\Column(type="integer", name="order_number")
 * @Gedmo\Sortable()
 */
private int $orderNumber;

Или написать собственное событие с реализацией инкремента

→ Ссылка
Автор решения: ProMix

Короче никак, сделал следующее: Свойство в аннотации тип int и unique (оно там миграцию для постгреса создаст типа UNIQUE INDEX. И добавил поле version для блокировки. И обычный сеттер. И делаю сет перед сохранением. А метод простой:

    public function getNextNumber(): int
    {
        $qb = $this->connection->createQueryBuilder()
           ->select('MAX(o.column_number)')
           ->from('table_orders', 'o')
            ->execute();

        $max = (int)$qb->fetchColumn();

       return ++$max;
    }

Таким образом получаю максимальное - уникальное плюс один, даже если какие-то записи были удалены, то всегда получаю максимальное следующее, а так как есть блокировка, то и уникальное. Вот такой костыль получился.

→ Ссылка