跨2个(或更多)数据库映射实体

时间:2016-05-09 16:05:18

标签: symfony orm doctrine mapping multiple-databases

上下文

我正在开发一个网站,我必须使用来自两个不同数据库的数据(一个本地具有完全访问权限,一个外部只读取)。

其中一个“本地”实体需要映射到“外部”实体 外部实体不会更改其数据,因为无论如何我都无法将这些数据保存到数据库中。

问题

有没有办法标记这个映射,以便在检索本地实体时拉出外部实体?

1 个答案:

答案 0 :(得分:2)

简短回答,不。

您可以设置多个数据库连接,并为它们使用相同的实体类。但是单个实体将无法具有映射到不同数据库的属性。您可能在那里有引用字段,但这些字段只需要是可用于使用其他连接查找它们的键。例如,想象一下以下设置:

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   '%database_driver%'
                host:     '%database_host%'
                port:     '%database_port%'
                dbname:   '%database_name%'
                user:     '%database_user%'
                password: '%database_password%'
                charset:  UTF8
            customer:
                driver:   '%database_driver2%'
                host:     '%database_host2%'
                port:     '%database_port2%'
                dbname:   '%database_name2%'
                user:     '%database_user2%'
                password: '%database_password2%'
                charset:  UTF8

    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    AcmeBundle:  ~
            customer:
                connection: customer
                mappings:
                    AcmeBundle: ~

两位经理都将使用AcmeBundle中的实体类。然后你可以做类似

的事情
public function someControllerAction(){
    // Get customer from the default connection
    $customer = $this->getDoctrine()
                     ->getManager() // If no value is provided the default is implied
                     ->getRepository('AcmeBundle:Customer')
                     ->findOneBy([
                         'id'=>12
                     ]);

    // Get the customers details from another connection
    $customerDetails = $this->getDoctrine()
                            ->getManager('customer')
                            ->getRepository('AcmeBundle:CustomerDetails')
                            ->findOneBy([
                                'customer_details_id' => $customer->getDetailsId()
                            ]);
    ...
}