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 шт):
Если
поле нужно для сортировки(по возрастанию)
то простое решение "в лоб":
/**
* @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;
Или написать собственное событие с реализацией инкремента
Короче никак, сделал следующее: Свойство в аннотации тип 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;
}
Таким образом получаю максимальное - уникальное плюс один, даже если какие-то записи были удалены, то всегда получаю максимальное следующее, а так как есть блокировка, то и уникальное. Вот такой костыль получился.