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

55

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

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

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

Ваш Ответ

9   ответов
0

л копию каталога и заново сгенерировал все объекты в каталоге копирования. Затем я скопировал необходимые объекты в исходный каталог.

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

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

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

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

продавец 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"

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

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

вы должны сделать это следующим образом:

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!

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

что такоеwhateveryouwant ?
Это, похоже, не работает, если база данных содержит таблицы без первичного ключа, даже если ваш фильтр содержит таблицу, которая имеет первичный ключ. есть идеи?
мое удовольствие, у меня были некоторые плохие времена по этому вопросу. Просто будьте осторожны с фильтром, он довольно "разумный". как если бы вы установили--filter="mytable" Доктрина займет все таблицы, начиная с «mytable». а не только таблица с именем & quot; mytable & quot; (была эта проблема тоже).
@Coussinsky Это работает, за исключением того, что у меня есть одна маленькая проблема: --filter = MyTable не работает. Если я уберу опцию, я получу все таблицы в базе данных, если добавлю опцию, которую я получу: «Нет классов метаданных для обработки». «Мысли?stackoverflow.com/questions/13629959/…
вы забыли & quot; Вы пишете это так: --filter = & quot; MyTable & quot;
28

остей. Добавляя имя объекта после пакета, он генерировал только тот объект, который меня интересовал.

php app/console doctrine:generate:entities AppMyBundle:Yourtablename --no-backup
На самом деле, если я использую эту команду, у меня естьNamespace "VENDOR\MyBundle\Entity\TableName" does not contain any mapped entities.и если я использую полныйdoctrine:generate:entities это воссоздает все мои сущности, кроме новой ... Что я делаю не так ?!
Это должно быть включено в верхний ответ, потому что эта Доктрина воссоздала все мои ~ 300 сущностей.
@ Денис Убедитесь, что вы находитесь в корне проекта. Должно быть «приложение» каталог, когда вы делаете команду ls / dir.
& quot; Не удалось открыть входной файл: app / console & quot;
у меня это тоже не работает. Он генерирует сущности из всех моих пакетов.
8

@fyrye's comment that is currently hidden deserves the credit, wanted to add this so it's not missed by others.

/** @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).*$/');

source: https://coderwall.com/p/jofhdw/doctrine-tell-which-tables-to-work-with

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

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

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

куда вы добавляетеsetFilterSchemaAssetsExpression() вызов? Вы модифицируете основные файлы Symfony или Doctrine?
@mHouse в Symfony2.3 + было бы проще редактироватьapp/config/config.yml включитьschema_filter вариант, который вызываетsetFilterSchemaAssetsExpression увидеть:symfony.com/doc/current/reference/configuration/doctrine.html
Хороший вопрос, который я не могу вспомнить! Я думаю, что есть файл начальной загрузки или что-то с именем cli-config.php, которое использует файл ./vendor/bin/doctrine - см.doctrine-orm.readthedocs.org/en/latest/reference/… это помогает?
12

] см.http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

выполнить 3 команды в 3 этапа:

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

(NOTE: если имя вашей базы данныхmy_meeting Вам нужно будет изменить его наMyMeeting вfilter="MyMeeting" для доктрины, чтобы найти ваше имя таблицы. Это связано с тем, что доктрина всегда удаляет подчеркивания и добавляет к названию таблицы регистр Camel. Если нет, вы получите эту ошибку:"Database does not have any mapping information".)

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

(NOTE: убедившись, что у вас есть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 is exactly your "AppBundle" in Symfony 2.7 Meeting is the target table (Camel-Case sensitive)

Чтобы быть уверенным, проверьте этот каталог:

src\AppBundle/Resources/config/doctrine/Meeting.orm.xml

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

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

ЗАМЕТКА 2: В качестве последнего шага вы должны удалить, например, XML-файл доктрины orm dbsrc\AppBundle/Resources/config/doctrine/VisitorData.orm.xml

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

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

3

Если вы получаете «Нет классов метаданных для обработки». сообщение попробуйте преобразовать ваше имя таблицы в Doctrine Camel Case в параметре фильтра.

& Quot; my_table_name & Quot; должен быть записан как "MyTableName".

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

Ни один из описанных выше обходных путей не помог мне.

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

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

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

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

3

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

Похожие вопросы