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

youtube.com/watch?v=7hFivbgIEqk

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

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