Создание единого объекта из существующей базы данных с помощью symfony2 и doctrine
можно ли создать один объект из базы данных с помощью инструмента консоли Symfony2?
в середине кода мне пришлось добавить таблицу и есть изменения, внесенные в существующие классы сущностей. Поэтому я не хочу, чтобы все мои сущности были восстановлены.
любые предложения будут оценены!
9 ответов:
у меня была такая же проблема, вы должны сделать так:
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 !
надеюсь, что это поможет вам
для третьей команды doctrine продолжал восстанавливать все файлы сущностей. Добавив имя сущности после пакета, он создал только ту сущность, которая меня интересовала.
php app/console doctrine:generate:entities AppMyBundle:Yourtablename --no-backup
простое рабочее решение для аннотации опции 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"для доктрины, чтобы найти имя таблицы. Это связано с тем, что doctrine всегда будет удалять подчеркивания и добавлять Camel-case к имени таблицы. Если нет, вы получите эту ошибку: база данных"не имеет отображения информации".)$ php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity --from-database --filter="Meeting"(Примечание: убедившись, что у вас есть
namespace AppBundle\Entity;в папке встреча.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
- встреча-это целевая таблица (Camel-Case чувствительный)
чтобы быть уверенным, проверьте этот каталог:
src\AppBundle / Resources/config/doctrine / Meeting.ОЗР.xml
и убедившись, что у вас есть только .xml-файлы для таблицы, которую вы хотите создать файлы класса сущностей, и никакие другие. Затем выполните следующую команду, чтобы сгенерировать get и set методы для вашего класса сущностей, который вы создали ранее
$ php app/console doctrine: generate: entities AppBundle: Meeting --нет-резервное копирование
примечание 2: В качестве последнего шага вы должны удалить файл XML doctrine orm db, например
src\AppBundle/Resources/config/doctrine/VisitorData.orm.xmlэто работает очень хорошо для меня.
для объяснения, пожалуйста, прочитайте: http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html
комментарий@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 фильтрует только после того, как он имеет прочитайте метаданные из всех ваших таблиц, которые, если они не имеют первичных ключей или имеют какую-либо другую проблему, приведут к ошибке команды
Я бы оставил это как комментарий к принятому ответу, но я новичок.
для таких, как я, у кого были проблемы с --filter switch, отображающим несколько таблиц с совпадающими строками в именах, можно использовать шаблон.
примеры имен таблиц:
поставщик VendorContact
php app/console doctrine:mapping:convert metadata_format \ ./src/App/MyBundle/Resources/config/doctrine \ --from-database \ --filter="Vendor"эта команда преобразует обе таблицы, а не только поставщика. Если вы хотите только поставщика, а не VendorContact, используйте шаблон в --фильтр:
php app/console doctrine:mapping:convert metadata_format \ ./src/App/MyBundle/Resources/config/doctrine \ --from-database \ --filter="\bVendor\b"надеюсь, что это поможет кому-то!
отлично работает с Symfony 3 тоже.
Если вы получаете "нет классов метаданных для обработки."сообщение попробуйте преобразовать имя таблицы в доктрину camel casing в параметре filter.
"my_table_name "должен быть записан как"MyTableName".
ни один из ответов не был совершенно правильным для меня с помощью 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
У меня была точно такая же проблема с Symfony 2.4 и MySQL.
ни один из обходных путей, опубликованных выше, не работал для меня.
Я закончил создание новой базы данных с таблицами, которые я хочу извлечь (это может быть легко сделать, потому что MySQL предоставляет сценарий создания).
затем изменил соединение с этой новой базой данных и выполнил команду извлечения сущности оттуда.
кажется немного радикальным, но я не буду создавать объекты по рука.
надеюсь, что это поможет
не работал ни один из них для моего symfony 3.3. Поэтому я просто создал копию каталога и повторно сгенерировал все объекты в каталоге копирования. Затем я скопировал необходимые объекты в свой исходный каталог.
--фильтр не работает из-за этой проблемы https://github.com/symfony/symfony/issues/7717
Comments