@zzmaster

Как привести Entity в соответствие с таблицей в в Symfony 6?

Я решил привести Entity в соответствие с таблицей, чтобы doctrine:migrations:diff ничего не предлагал. Есть таблица
CREATE TABLE `monitors` (
  `monitor_id` int(11) NOT NULL AUTO_INCREMENT,
  `site_id` int(11) DEFAULT NULL,
  `checker_id` int(11) DEFAULT NULL,
  `params` longtext NOT NULL COMMENT '(DC2Type:json)',
  `enabled` tinyint(3) unsigned NOT NULL DEFAULT 1,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`monitor_id`),
  UNIQUE KEY `site_id_checker_id` (`site_id`,`checker_id`),
  KEY `UNIQ_863DAD3DF6BD1646` (`site_id`),
  KEY `UNIQ_863DAD3D77637F8F` (`checker_id`),
  CONSTRAINT `FK_863DAD3D77637F8F` FOREIGN KEY (`checker_id`) REFERENCES `checkers` (`checker_id`),
  CONSTRAINT `FK_863DAD3DF6BD1646` FOREIGN KEY (`site_id`) REFERENCES `sites` (`site_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


начинаю по ней аттрибутить.

#[ORM\Entity(repositoryClass: MonitorRepository::class)]
#[ORM\Table(name: "monitors")]
#[ORM\Index(name: "UNIQ_863DAD3DF6BD1646", columns: ["site_id"])]
#[ORM\Index(name: "UNIQ_863DAD3D77637F8F", columns: ["checker_id"])]
#[ORM\Index(name: "site_id_checker_id", columns: ["site_id", "checker_id"])]
class Monitor
{


Однако последующий запуск diff выдает
63c54f956c953953130962.png

Такое ощущение, что я чего-то не понимаю. diff ранее предлагал sql запросы, чтобы подогнать таблицу под Entity, то есть предлагал удалить эти индексы. Их аттрибутов ранее не было в сущности. Когда я их добавил, я ожидал, что diff ничего не скажет про эту таблицу, а тут он как бы пытается их добавить...
(хорошо бы иметь команду, которая это делала бы...)

Еще момент. У атрибута есть поле fields
https://www.doctrine-project.org/projects/doctrine...
Разъясните плиз, когда и как его надо использовать
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
@tukreb
Доктрина очень капризна, даже порядок объявлений атрибутов в таблице важен (в частности для ManyToMany).
Я обычно делаю так.
Автоматически генерируемые имена индексов использую только для отношений ManyToMany (потому что доктрина не поддерживает другие :))
Всё остальное пишу руками.
Далее делаю doctrine:mapping:import (эта функция кстати депрекейтет и скоро удалят, если никто не вызовется поддерживать) и сверяю с тем, что написано у меня, т.к Доктрина очень капризна, у вас может быть всё правильно написано, но не в том порядке или не в том месте.
Я не знаю как там с MySQL, но в PostgreSQL все индексы и комментарии (за исключением внешних ключей) объявляю только через отдельные: $this->addSql();
Например:
$this->addSql('COMMENT ON COLUMN table.field IS \'(DC2Type:datetime_immutable)\'');

Потому что доктрина не всегда видит или не любит, если всё это делать сразу при объявление таблиц. Это конечно звучит как бред, но работая с доктриной и набив шишки некоторые моменты уже обходишь за километр проверенными решениями.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы