【问题标题】:Doctrine not detecting schema changes with one entity manager and multiple databases学说没有检测到一个实体管理器和多个数据库的模式更改
【发布时间】:2012-12-11 16:16:57
【问题描述】:

使用 Symfony-2.1 和 Doctrine-2.3。我有多个数据库,需要进行跨数据库连接,所以我遵循了以下建议:

并设置多个连接和一个实体管理器。这里是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,它只会输出与db2.tables相关的sql。

我已经检查了app/console doctrine:mapping:info,所有实体类都在映射中。

这是 Doctrine/Symfony 的限制还是我需要调整我的配置?谢谢。

【问题讨论】:

    标签: php symfony doctrine doctrine-orm


    【解决方案1】:

    每个实体管理器只能有一个连接。将默认实体管理器一分为二。 app/console doctrine:schema:update 采用可选参数 (em) 来指定正在使用的实体管理器。你必须运行它两次:

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

    Symfony2 食谱中还有一篇短文 (How to work with Multiple Entity Managers and Connections) 值得一读。

    【讨论】:

    • 在单个 web 应用程序中,我维护 10 个捆绑包和 7 个数据库。使用每个 EntityManager(又名数据库)的此配置,我需要为所有这 10 个捆绑包设置/重复相同的映射,否则会发生“在链配置的命名空间中找不到类 X”。难道没有更好的方法吗?
    • @noisebleed:我之前对两个数据库中的实体进行了两次查询,并使用 array_map 或类似方法将它们结合到控制器代码中。映射问题令人头疼。我最终将它们移动到同一个数据库中的两个模式,这完美无缺。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多