Як згенерувати сутності з існуючої бази даних

Дата оновлення перекладу 2022-05-12

Як згенерувати сутності з існуючої бази даних

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

Note

Як каже документація інструментів Doctrine, зворотнє проектування - це одноразовий процес, щоб розпочати проект. Doctrine здатна конвертувати приблизно 70-80% необхідної інформації відображення, засновуючись на полях, індексах та обмеженнях зовнішнього ключа. Doctrine не може виявити інверсні асоціації, типи спадкування, сутності з зовнішнім ключем в якості основного ключу або семантичні операції над асоціаціями такі як каскад чи події життєвого циклу. Деяка додаткова робота над створеними сутностями знадобиться пізніше, щоб підлаштувати кожну з них під специфікаії вашої моделі домену.

Цей туторіал припускає, що ви використовуєте простий застосунок-блог з наступними двома таблицями: blog_post та blog_comment. Запис коментарів пов'язана з записом постів завдяки обмеженню зовнішнього ключа.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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).

Першим кроком на шляху до побудови класів сутності з існуючої бази даних є попросити вникнути в базу даних та згенерувати відповідні файли метаданих. Файли метаданих описують який клас сутності генерувати, засновуючись на полях таблиці.

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

Цей інструмент командної строки просить Doctrine вникнути в базу даних та згенерувати нові PHP-класи з метаданими в анотаціях в папці src/Entity. Це створить два файли: BlogPost.php та BlogComment.php.

Tip

Також можливо генерувати файли метаданих в XML або YAML-форматі:

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

В цьому випадку, переконайтеся, що ваша конфігурація враховує це:

1
2
3
4
5
6
7
8
9
10
11
12
# config/packages/doctrine.yaml
doctrine:
    # ...
    orm:
        # ...
        mappings:
            App:
                is_bundle: false
                type: xml # "yml" позначено застарілим для doctrine v2.6+ і буде видалено у v3
                dir: '%kernel.project_dir%/config/doctrine'
                prefix: 'App\Entity'
                alias: App

Генерування геттерів та сеттерів або PHP-класів

Згенеровані PHP-класи тепер мають властивості та метадані в анотаціях, але в них немає методів геттеру/сеттеру. Якщо ви не генерували метадані в XML або YAML-фоматі, у вас навіть немає PHP-класів!

Для генерування відсутнів методів геттеру/сеттерку (або для створення класів, якщо необхідно), запустіть:

1
2
3
4
5
// генерує методи геттерів/сеттерів для всіх Сутностей
$ php bin/console make:entity --regenerate App

// генерує методи геттерів/сеттерів для однієї конкретної Сутності
$ php bin/console make:entity --regenerate App\Entity\Country

Note

Якщо ви хочете мати відносини OneToMany, то вам знадобиться додати їх вручну в сутності (наприклаж, додати властивість comments до BlogPost) або до згенерованих файлів XML або YAML. Додайте розділ по необхідних сутностях для відносин one-to-many, визначивши налаштування inversedBy та mappedBy.

Згенеровані сутності тепер готові до використання. Сгенерированные сущности теперь готовы к использованию. Повеселіться!