Generowanie pojedynczego encji z istniejącej bazy danych przy użyciu symfony2 i doctrine

Czy możliwe jest wygenerowanie pojedynczego encji z bazy danych przy użyciu narzędzia konsoli Symfony2?

W trakcie kodowania musiałem dodać tabelę i wprowadzono modyfikacje do istniejących klas encji. Więc nie chcę, żeby wszystkie moje byty zostały zregenerowane.

Wszelkie sugestie będą mile widziane!

Author: Phill Pafford, 2012-04-29

9 answers

Miałem ten sam problem, musisz zrobić tak:

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

Then

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

Gdzie metadata_format jest zakończeniem pliku, który chcesz wygenerować (np. xml, yml, adnotacja)

I wreszcie

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

Tak jak ta doktryna załaduje tylko byt, którego potrzebujesz. Po prostu uważaj na filtr musisz użyć CamelCase !

Mam nadzieję, że to ci pomoże

 97
Author: Snroki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-29 09:32:12

Dla trzeciego polecenia, doctrine regenerował wszystkie pliki encji. Dodając nazwę encji po pakiecie, wygenerowano tylko encję, którą byłem zainteresowany.

php app/console doctrine:generate:entities AppMyBundle:Yourtablename --no-backup
 28
Author: John Baldwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-02 21:05:36

Proste rozwiązanie dla opcji Symfony 2.7 oraz dla [/xml/yml] zobacz http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

Wykonaj 3 polecenia w 3 krokach:
$ php app/console doctrine:mapping:import --force AppBundle xml --filter="Meeting"

(Uwaga: jeśli Twoja nazwa bazy danych to my_meeting, musisz zmienić ją na MyMeeting w filter="MyMeeting", aby doctrine znalazł nazwę Twojej tabeli. Dzieje się tak, ponieważ doctrine zawsze usuwa podkreślniki i dodaje Wielbłąd do nazwy tabeli. Jeśli nie, otrzymasz ten błąd: "Baza Danych nie posiada żadnych informacji o mapowaniu" .)

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

(Uwaga: upewniając się, że masz namespace AppBundle\Entity; Jak poniżej w swoim spotkaniu .plik klasy php w ten sposób:

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

use Doctrine\ORM\Mapping as ORM;

Jeśli nie dodać.)

Gdzie:

    AppBundle jest dokładnie Twoim "AppBundle" w Symfony 2.7.]}
  • spotkanie jest tabelą docelową (Wielbłąd-rozróżnia wielkość liter)

Aby się upewnić, sprawdź ten katalog:

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

I upewniając się, że tylko masz .pliki xml dla tabeli, którą chcesz utworzyć pliki klas encji, a nie inne. Następnie uruchom poniższe polecenie, aby wygenerować metody get I set dla swojej klasy encji, którą utworzyłeś wcześniej

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

NOTE2: Jako ostatni krok należy usunąć plik XML ORM db na przykład w src\AppBundle/Resources/config/doctrine/VisitorData.orm.xml

To działa bardzo dobrze dla mnie.

Dla wyjaśnienia proszę przeczytać: http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

 10
Author: Dung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 07:30:35

@fyrye komentarz, który jest obecnie Ukryty, zasługuje na uznanie, chciał to dodać, aby nie został pominięty przez innych. Jest to podejście:

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

Źródło: https://coderwall.com/p/jofhdw/doctrine-tell-which-tables-to-work-with

Miałem problemy podczas uruchamiania następującego polecenia z powodu dużej liczby źle zdefiniowanych tabel starszych

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

Okazuje się, że flaga --filter filtruje tylko po odczytaniu metadanych ze wszystkich tabel co, jeśli nie mają kluczy podstawowych lub mają jakiś inny problem, spowoduje, że komenda nie powiedzie się

 8
Author: Carlton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-18 10:12:39

Zostawiłbym to jako komentarz do zaakceptowanej odpowiedzi, ale jestem nowicjuszem.

Dla takich jak ja, którzy mieli problemy z przełącznikiem -- filter mapującym wiele tabel z zbieżnymi łańcuchami w nazwach, można użyć wzorca.

Przykładowe nazwy tabel:

Sprzedawca VendorContact

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

To polecenie przekonwertuje obie tabele, a nie tylko Vendor. Jeśli chcesz tylko Vendor, a nie VendorContact, użyj wzorca w --filter:

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

Hope that helps ktokolwiek!

 3
Author: peej,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-19 05:00:28

Działa również świetnie z Symfony 3.

Jeśli otrzymujesz " żadnych klas metadanych do przetworzenia."wiadomość spróbuj przekonwertować nazwę tablename na doctrine w parametrze filter.

"my_table_name" musi być zapisane jako "MyTableName".

 3
Author: Ivo Necchi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-29 16:48:03

Żadna z odpowiedzi nie była dla mnie odpowiednia dla Symfony 3 . Skończyłem robiąc:

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
 3
Author: Brett Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 22:03:15

Miałem dokładnie ten sam problem z Symfony 2.4 i MySQL.

Żadne z obejść zamieszczonych powyżej nie zadziałało dla mnie.

Skończyłem tworząc nową bazę danych z tabelami, które chcę wyodrębnić(może to być łatwe, ponieważ MySQL dostarcza skrypt tworzenia).

Następnie zmieniono połączenie z nową bazą danych i wykonano stamtąd polecenie ekstrakcji encji.

Wydaje się być trochę radykalne, ale nie będę tworzyć Bytów ręcznie.

Mam nadzieję, że pomaga

 1
Author: Nicolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-30 13:39:54

Nie działa żaden z nich dla mojej symfony 3.3. Więc po prostu utworzyłem kopię katalogu i ponownie wygenerowałem wszystkie encje w katalogu kopiowania. Następnie skopiowałem wymagane encje w moim oryginalnym katalogu.

-- filtr nie działa z powodu tego problemu https://github.com/symfony/symfony/issues/7717

 0
Author: hanish singla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-23 05:09:03