web-dev-qa-db-ja.com

symfony2とdoctrineを使用して既存のデータベースから単一のエンティティを生成する

Symfony2コンソールツールを使用してデータベースから単一のエンティティを生成することは可能ですか?

コーディングの途中でテーブルを追加する必要があり、既存のエンティティクラスに変更が加えられました。したがって、すべてのエンティティを再生成する必要はありません。

提案は大歓迎です!

57
Sethunath

私は同じ問題を抱えていました、あなたはこのようにしなければなりません:

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、annotation)

そして最後に

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

このようにdoctrineは必要なエンティティのみをロードします。CamelCaseを使用する必要があるフィルターに注意してください!

これがあなたを助けることを願っています

101
Snroki

3番目のコマンドでは、doctrine=すべてのEntityファイルを再生成し続けました。バンドルの後にエンティティ名を追加することで、興味のあるエンティティのみが生成されました。

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

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の場合、doctrineの場合、filter="MyMeeting"MyMeetingに変更する必要がありますこれはdoctrineは常にアンダースコアを取り除き、キャメルケースをテーブル名に追加するためです。そうでない場合、このエラーが表示されます: "データベースにはマッピング情報がありません」

$ 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は、Symfony 2.7のまさに「AppBundle」です
  • 会議はターゲットテーブルです(キャメルケース依存)

念のため、このディレクトリを確認してください。

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

そして、エンティティクラスファイルを作成するテーブルの.xmlファイルのみがあり、他のファイルはないことを確認します。次に、以下のコマンドを実行して、以前に作成したエンティティクラスのgetおよびsetメソッドを生成します

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

注2:最後のステップとして、例えばsrc\AppBundle/Resources/config/doctrine/VisitorData.orm.xmlのxml doctrine orm dbファイルを削除する必要があります

それは私にとって非常にうまくいきます。

説明については、以下をお読みください: http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

12
Dung

現在隠されている@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フラグは、すべてのテーブルからメタデータを読み取った後にのみフィルタリングするため、主キーがない場合やその他の問題がある場合はコマンドが失敗することがわかります

8
Carlton

Symfonyを使用して、答えはどれも私にはぴったりではありませんでした。私はやったこと:

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
5
Brett Thomas

Symfony 3でもうまく機能します。

「処理するメタデータクラスがありません」と表示される場合。メッセージは、テーブル名をDoctrineフィルタパラメータのキャメルケースに変換してください。

「my_table_name」は「MyTableName」として記述する必要があります。

3
Ivo Necchi

私はこれを受け入れられた答えへのコメントとして残したでしょうが、私は初心者です。

名前に一致する文字列が含まれる複数のテーブルをマッピングする--filterスイッチで問題が発生した私のような人には、パターンを使用できます。

テーブル名の例:

ベンダーベンダー連絡先

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

このコマンドは、ベンダーだけでなく両方のテーブルを変換します。 VendorContactではなくVendorのみが必要な場合は、-filterでパターンを使用します。

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

それが誰かを助けることを願っています!

3
peej

Symfony 2.4とMySQLでもまったく同じ問題がありました。

上記の回避策はどれも役に立たなかった。

抽出したいテーブルで新しいデータベースを作成することになりました(MySQLには作成スクリプトが用意されているため、これは簡単です)。

次に、その新しいデータベースへの接続を変更し、そこからエンティティ抽出コマンドを実行しました。

少し過激なようですが、私は手でエンティティを作成しません。

役立つことを願っています

1
Nicolas

forSymfony 3

新しい「グループ」テーブルのエンティティを生成するには

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/AppBundle/Entity --filter Group

enter image description here

symfony 3ドキュメント に書かれているように

0
max4ever

私のsymfony 3.3ではこれらのいずれも機能しませんでした。したがって、ディレクトリのコピーを作成し、コピーディレクトリ内のすべてのエンティティを再生成しました。次に、必要なエンティティを元のディレクトリにコピーしました。

-この問題のため、フィルターは機能しません https://github.com/symfony/symfony/issues/7717

0
hanish singla