Можно ли создать единый объект из базы данных с помощью консольного инструмента Symfony2?
В середине кодирования мне пришлось добавить таблицу и внести изменения в существующие классы сущностей. Поэтому я не хочу, чтобы все мои сущности возродились.
Любые предложения будут оценены!
У меня была та же проблема, вы должны сделать так:
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!
Надеюсь, это поможет вам
Для третьей команды доктрина продолжала восстанавливать все файлы Entity. Добавив имя объекта после пакета, он создал только объект, который меня интересовал.
php app/console doctrine:generate:entities AppMyBundle:Yourtablename --no-backup
Namespace "VENDOR\MyBundle\Entity\TableName" does not contain any mapped entities.
и если я использую полную doctrine:generate:entities
она заново генерирует все мои сущности, кроме новой ... Что я делаю не так ?!
Простое рабочее решение для аннотации параметров 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/Ресурсы/конфигурации/Доктрина/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
Комментарий @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 фильтрует только ПОСЛЕ того, как он считывает метаданные из всех ваших таблиц, которые, если у них нет первичных ключей или есть какая-то другая проблема, приведут к сбою команды
setFilterSchemaAssetsExpression()
? Вы модифицируете основные файлы Symfony или Doctrine?
Хорошо работает с Symfony 3.
Если вы получаете "Нет классов метаданных для обработки". сообщение попытайтесь преобразовать ваше имя в кадр верблюда в доктрине фильтра в параметре фильтра.
"my_table_name" необходимо записать как "MyTableName".
Я бы оставил это как комментарий к принятому ответу, но я новичок.
Для таких, как я, у которых были проблемы с переключателем -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"
Надеюсь, что это поможет кому-то!
Ни один из ответов не подходит для меня, используя 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 обеспечивает создание script).
Затем изменилось соединение с этой новой базой данных и выполнило команду извлечения сущности оттуда.
Кажется, это немного радикально, но я не буду создавать объекты вручную.
Надеюсь, что поможет
Не работает ни одно из них для моего symfony 3.3. Поэтому я просто создал копию каталога и повторно сгенерировал все сущности в каталоге копирования. Затем я скопировал требуемые объекты в моем исходном каталоге.
- фильтр не работает из-за этой проблемы https://github.com/symfony/symfony/issues/7717
--filter="mytable"
доктрина будет принимать все таблицы, начинающиеся с «mytable», а не только таблицу с именем «mytable» (с такой же проблемой).