Як згенерувати сутності з існуючої бази даних
Дата оновлення перекладу 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
.
Згенеровані сутності тепер готові до використання. Сгенерированные сущности теперь готовы к использованию. Повеселіться!