Как создать сущности Entity Doctrine в Symfony из существующей базы данных.

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

Создание Entity с аннотациями.

Как говорится в документации по инструментам Doctrine, реверс-инжиниринг — это единовременный процесс для начала проекта. Doctrine может преобразовывать приблизительно 70-80% необходимой информации отображения на основе полей, индексов и ограничений внешнего ключа.

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

После создания entity может потребоваться дополнительная работа над созданными объектами, чтобы каждый из них соответствовал особенностям вашей предметной модели.

Ниже для примера, предполагается, что вы используете простое приложение для блога со следующими двумя таблицами: blog_post и blog_comment. Комментарий связан с постом благодаря ограничению внешнего ключа.

Ниже представлен SQL код для создания этих двух таблиц:

CREATE TABLE `blog_post` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `content` longtext COLLATE utf8_unicode_ci NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `blog_comment` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `post_id` bigint(20) NOT NULL,
  `author` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `content` longtext COLLATE utf8_unicode_ci NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `blog_comment_post_id_idx` (`post_id`),
  CONSTRAINT `blog_post_id` FOREIGN KEY (`post_id`) REFERENCES `blog_post` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Прежде чем выполнить консольные команды, убедитесь, что параметры подключения к вашей базе данных правильно установлены в файле .env (или файле переопределения .env.local).

Первый шаг к созданию классов сущностей из существующей базы данных — указать Doctrine проанализировать базу данных и сгенерировать соответствующие файлы метаданных.

Файлы метаданных описывают класс сущности для генерации на основе полей таблицы.

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity

Этот инструмент командной строки просит Doctrine проанализировать базу данных и сгенерировать новые классы PHP с метаданными аннотации в src/Entity. В текущем примере будет создана два файла: BlogPost.php и BlogComment.php.

Если того требуется, то возможно генерировать файлы метаданных в XML или в конечном итоге в YAML. Для этого заместо annotation указываем нужный формат:

 php bin/console doctrine:mapping:import "App\Entity" xml --path=config/doctrine

Генерация методов гетеров и сетеров в классах PHP.

Сгенерированные PHP-классы теперь имеют свойства и метаданные аннотации, но у них нет методов получения или установки. Если вы сгенерировали метаданные XML или YAML, у вас даже нет классов PHP!

Чтобы сгенерировать недостающие методы getter / setter (или создать классы при необходимости), выполните:

// generates getter/setter methods
 php bin/console make:entity --regenerate App

Если вы хотите иметь отношение OneToMany, вам нужно будет добавить его вручную в сущность (например, добавить свойство комментариев в BlogPost) или в сгенерированные файлы XML или YAML. Добавьте раздел о конкретных сущностях для одного ко многим, определяя куски inversedBy и mappedBy.

Созданные объекты Entity теперь готовы к использованию, но стоит сверить аннотации на наличие всех нужных сведений о схемах таблиц.

Добавить комментарий

Ваш адрес email не будет опубликован.