Генерация единой сущности из существующей базы данных с использованием symfony2 и доктрины

51

Можно ли создать единый объект из базы данных с помощью консольного инструмента Symfony2?

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

Любые предложения будут оценены!

Теги:
database
doctrine

9 ответов

91
Лучший ответ

У меня была та же проблема, вы должны сделать так:

php app/console doctrine:mapping:convert metadata_format \
    ./src/App/MyBundle/Resources/config/doctrine \
    --from-database \
    --filter="Yourtablename"

Тогда

php app/console doctrine:mapping:import AppMyBundle \
    metadata_format --filter="Yourtablename"

Где metadata_format - это файл, который вы хотите сгенерировать (например, xml, yml, аннотация)

И наконец

php app/console doctrine:generate:entities AppMyBundle --no-backup

Подобно этой доктрине будет загружаться только сущность, в которой вы нуждаетесь. Просто будьте осторожны на фильтре, который вы должны использовать CamelCase!

Надеюсь, это поможет вам

  • 0
    Большой ! Это помогло. Рад наградить вас заслуженным приятелем. Спасибо!
  • 12
    мое удовольствие, у меня были некоторые плохие времена по этому вопросу. Просто будьте осторожны с фильтром, это довольно «разумно», как если бы вы установили --filter="mytable" доктрина будет принимать все таблицы, начинающиеся с «mytable», а не только таблицу с именем «mytable» (с такой же проблемой).
Показать ещё 13 комментариев
29

Для третьей команды доктрина продолжала восстанавливать все файлы Entity. Добавив имя объекта после пакета, он создал только объект, который меня интересовал.

php app/console doctrine:generate:entities AppMyBundle:Yourtablename --no-backup
  • 2
    Это должно быть включено в верхний ответ, потому что эта Доктрина воссоздала все мои ~ 300 сущностей.
  • 3
    На самом деле, если я использую эту команду, у меня есть Namespace "VENDOR\MyBundle\Entity\TableName" does not contain any mapped entities. и если я использую полную doctrine:generate:entities она заново генерирует все мои сущности, кроме новой ... Что я делаю не так ?!
Показать ещё 3 комментария
10

Простое рабочее решение для аннотации параметров Symfony 2.7 и для [/xml/yml] см. http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

выполните 3 команды за 3 шага:

$ php app/console doctrine:mapping:import --force AppBundle xml --filter="Meeting"

( ПРИМЕЧАНИЕ:, если ваше имя базы данных my_meeting Вам нужно будет изменить его на MyMeeting в filter="MyMeeting" для доктрины, чтобы найти имя вашей таблицы. Это потому, что доктрина всегда будет подчеркивает и добавляет кейл-кейл к вашему имени таблицы. Если нет, вы получите эту ошибку: "В базе данных нет информации о сопоставлении".)

$ php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity --from-database --filter="Meeting"

( ПРИМЕЧАНИЕ: убедитесь, что у вас есть namespace AppBundle\Entity;, как показано ниже в файле Meeting.php, например:

<?php
/**
* Created by PhpStorm.
* User:
* Date: 03-Sep-2015
* Time: 3:23 PM
*/
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

Если не добавить его.)

где:

  • AppBundle - это именно ваш "AppBundle" в Symfony 2.7
  • Встреча - целевая таблица (чувствительная к верблюду)

УБЕДИТЕСЬ, проверьте этот каталог:

ЦСИ\AppBundle/Ресурсы/конфигурации/Доктрина/Meeting.orm.xml

И УБЕДИТЕСЬ, что у вас есть только .xml файлы для таблицы, в которой вы хотите создать файлы классов сущностей, а другие нет. Затем запустите эту команду ниже, чтобы сгенерировать методы get и set для вашего класса сущности, который вы создали ранее

$php app/console doctrine: generate: entity AppBundle: Meeting --no-backup

Примечание 2: В качестве последнего шага вы должны удалить xml-доктрину orm db файла, например, src\AppBundle/Resources/config/doctrine/VisitorData.orm.xml

Это очень хорошо работает для меня.

Для объяснения читайте: http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

7

Комментарий @fyrye, который в настоящее время скрыт, заслуживает кредита, хотел добавить это, чтобы он не пропустил другие. Это подход:

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

// for excluding an specific table
$config->setFilterSchemaAssetsExpression('/^(table_to_reverse_engineer_1|table_to_reverse_engineer_2).*$/');

источник: https://coderwall.com/p/jofhdw/doctrine-tell-which-tables-to-work-with

У меня возникали проблемы при запуске следующей команды из-за большого количества плохо определенных устаревших таблиц

php ./vendor/bin/doctrine orm:convert-mapping --force --from-database annotation ./src/UI/Entity/

Оказывается, флаг -filter фильтрует только ПОСЛЕ того, как он считывает метаданные из всех ваших таблиц, которые, если у них нет первичных ключей или есть какая-то другая проблема, приведут к сбою команды

  • 0
    куда вы добавляете вызов setFilterSchemaAssetsExpression() ? Вы модифицируете основные файлы Symfony или Doctrine?
  • 0
    Хороший вопрос, который я не могу вспомнить! Я думаю , что есть загрузочный файл или что - то называется кли-config.php , что ./vendor/bin/doctrine использование файла - см doctrine-orm.readthedocs.org/en/latest/reference/... делает эту помощь?
Показать ещё 1 комментарий
3

Хорошо работает с Symfony 3.

Если вы получаете "Нет классов метаданных для обработки". сообщение попытайтесь преобразовать ваше имя в кадр верблюда в доктрине фильтра в параметре фильтра.

"my_table_name" необходимо записать как "MyTableName".

  • 0
    Именно так! В первый раз, когда я попробовал, у меня возникли ошибки, но когда я написал имя сущности в стиле верблюжьего ящика, все пошло правильно.
3

Я бы оставил это как комментарий к принятому ответу, но я новичок.

Для таких, как я, у которых были проблемы с переключателем -filter, отображающим несколько таблиц с совпадающими строками в именах, можно использовать шаблон.

Примеры имен таблиц:

Vendor VendorContact

php app/console doctrine:mapping:convert metadata_format \
    ./src/App/MyBundle/Resources/config/doctrine \
    --from-database \
    --filter="Vendor"

Эта команда преобразует обе таблицы, а не только Vendor. Если вам нужен только Vendor, а не VendorContact, используйте шаблон в файле -filter:

php app/console doctrine:mapping:convert metadata_format \
    ./src/App/MyBundle/Resources/config/doctrine \
    --from-database \
    --filter="\bVendor\b"

Надеюсь, что это поможет кому-то!

  • 0
    Это ответ, который я искал. Мне не хватало обратной косой черты b!
1

Ни один из ответов не подходит для меня, используя Symfony 3. Я закончил:

php bin/console doctrine:mapping:import --force MyBundle xml --filter="MyTable"

php bin/console doctrine:mapping:convert annotation ./src --filter="MyTable"

php bin/console doctrine:generate:entities MyBundle:MyTable --path ./src
1

У меня была точно такая же проблема с Symfony 2.4 и MySQL.

Ни один из обходных решений, опубликованных выше, не работал у меня.

В итоге я создал новую базу данных с таблицами, которые я хочу извлечь (это может быть легко сделать, потому что MySQL обеспечивает создание script).

Затем изменилось соединение с этой новой базой данных и выполнило команду извлечения сущности оттуда.

Кажется, это немного радикально, но я не буду создавать объекты вручную.

Надеюсь, что поможет

0

Не работает ни одно из них для моего symfony 3.3. Поэтому я просто создал копию каталога и повторно сгенерировал все сущности в каталоге копирования. Затем я скопировал требуемые объекты в моем исходном каталоге.

- фильтр не работает из-за этой проблемы https://github.com/symfony/symfony/issues/7717

  • 0
    Этот вопрос был специально для symfony2, как следует из названия
  • 0
    @Sethunath. , Согласен. , Вот почему я упомянул версию. , это может помочь кому-то, как я, потому что никто другой не просил об этой версии.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню