3

Symfony-2.1 と Doctrine-2.3 を使用。複数のデータベースがあり、クロスデータベース結合を行う必要があるため、次の提案に従いました。

複数の接続と 1 つのエンティティ マネージャーをセットアップします。ここにあるapp/config/config.yml

doctrine:
    dbal:
        default_connection: db1
        connections:
            db1:
                driver:   pdo_mysql
                host:     127.0.0.1
                dbname:   db1
            db2:
                driver:   pdo_mysql
                host:     127.0.0.1
                dbname:   db2
    orm:
        default_entity_manager: default
        auto_generate_proxy_classes: %kernel.debug%
        entity_managers:
            default:
                auto_mapping: true
                mappings:
                    FirstBundle:
                        type:   annotation
                        dir:    Model
                        prefix: NoiseLabs\FirstBundle\Model
                    SecondBundle:
                        type:   annotation
                        dir:    Model
                        prefix: NoiseLabs\SecondBundle\Model

のエンティティ クラスFirstBundle:

namespace NoiseLabs\FirstBundle\Model;

/**
 * @ORM\Entity
 * @ORM\Table(name="db1.table1")
 */
class FirstEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

のエンティティ クラスSecondBundle:

namespace NoiseLabs\SecondBundle\Model;

/**
 * @ORM\Entity
 * @ORM\Table(name="db2.table2")
 */
class SecondEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="NoiseLabs\FirstBundle\Model\FirstEntity")
     * @ORM\JoinColumn(name="firstId", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $first;
}

現在、問題はapp/console doctrine:schema:update --dump-sql(デフォルト接続) のスキーマ変更のみを検出するdb1.tablesことです。デフォルトの接続をに設定すると、にdb2関連するSQLのみが出力されdb2.tablesます。

確認したapp/console doctrine:mapping:infoところ、すべてのエンティティ クラスがマップされています。

これは Doctrine/Symfony の制限ですか、それとも設定を調整する必要がありますか? ありがとう。

4

1 に答える 1

0

各エンティティマネージャは、1つの接続のみを持つことができます。デフォルトのエンティティマネージャを2つに分割します。app/console doctrine:schema:updateオプションの引数(em)を取り、使用中のエンティティマネージャを指定します。2回実行する必要があります。

app/console doctrine:schema:update --dump-sql em="default"
app/console doctrine:schema:update --dump-sql em="my_second_em"

Symfony2クックブックには読む価値のある短い記事(複数のエンティティマネージャーと接続を操作する方法)もあります。

于 2012-12-26T02:04:05.590 に答える