Doctrine2 — генерируем сущности из таблиц базы данных

Согласно документации (кстати, может изменяться), для того, чтобы сгенерировать сущности из таблицы базы данных, нужно выполнить 2 шага:

1. сгенерировать yml из DDL таблиц, командой: 

app/console doctrine:mapping:import --force AccountBundle yml

где AccountBundle - директория по адресу src/AccountBundle, а yml - формат в котором будут сохранены данные

2. сгенерировать сущности из yml, командой:

app/console doctrine:generate:entities AccountBundle

Все вроде бы просто, и все должно сработать, но у меня возникли некоторые проблемы.

Итак, первая проблема - слишком большое кол-во таблиц (большой проект с шардированными таблицами), поэтому доктрина весела несколько часов, после чего мне это надоело и я начал разбираться, как мне исключить типичные таблицы и перым делом, я понял, что мне нужны базовые таблицы схемы public. Но, стоит обратить внимание, что если Вы используете PostgreSQL, то доктрина всем таблицам схемы public удаляет префикс public, именно поэтому регулярка в параметре schema_filter нацелена на проверку отсутсвия точки:

# Doctrine Configuration
doctrine:
    dbal:
        default_connection: main
        connections:
            main:
                schema_filter: /^(?!.*\.).+$/

Если Вы использовали нестандартый тип данных, то Вы получите ошибку:

  [Doctrine\DBAL\DBALException]                                                                            
  Unknown database type _text requested, Doctrine\DBAL\Platforms\PostgreSQL92Platform may not support it.

В этом случае, в файле настроек app/config/app/config.yml нужно приравнять нестандартный тип (например your_type), к одному из стандартных, так:

doctrine:
    dbal:
        default_connection: main
        connections:
            main:
                mapping_types:
                    your_type: string

Если, Вы в какой-то таблице не используете PK, то получите ошибку:

  [Doctrine\ORM\Mapping\MappingException]                                                                                             
  Table balance_history has no primary key. Doctrine does not support reverse engineering from tables that don't have a primary key.

 Выход: добавить PK или игнорировать данную таблицу:

schema_filter: /^(?!.*table_witout_pk|.*\.).+$/

А что делать, если Вы не используете Symfony, то Вы можете задавать данный фильтр так:

/** @var \Doctrine\DBAL\Connection $connection */
$config = $connection->getConfiguration();

$config->setFilterSchemaAssetsExpression('/^(?!table_name_to_exclude).*$/');

Или наоборот, укажем только те таблицы, которые нам интересны:

$config->setFilterSchemaAssetsExpression('/^(recipes|ingredients).*$/');

В итоге, после выполнения 1-ой команды у Вас будут сгенерированы yml-файлы в директории:

src/AccountBundle/Resources/config/doctrine

p.s. для тех, кто хочет покопаться:

Выборка схем и таблиц происходит в методе: \Doctrine\DBAL\Schema\AbstractSchemaManager::listTableNames

Фильтрация заданная мной в конфигурации, происходит в методе: \Doctrine\DBAL\Schema\AbstractSchemaManager::filterAssetNames

Удачки. 

Оцени публикацию:
  • 0,0
Оценили человек: 0

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

Новые заметки:

Про что мы забываем когда делаем оценку задачи по времени

Список вопросов для собеседования разработчика по телефону

Symfony2 авторизация без Doctrine2 для чайника

Phpstorm7 LiveEdit

Жесткий хабр или не хабр, тогда кто?

Яндекс.Деньги мошенничество

Как узнать какие страницы в поиске яндекса или это секрет

Последние комменты:

Yapro CMS:

Здравствуйте, Гость | Войти | Регистрация | Карта сайта | RSS ленты | Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2018 YaPro.Ru

Главная » Веб-мастеру » PHP »