在Symfony2中使用2个数据库和一个实体管理器

时间:2014-10-01 01:04:10

标签: symfony orm doctrine entitymanager

我需要将存档数据库保存到Symfony2中的应用程序。 在其中,我将保留所有超过90天的记录。我以为我只能使用一个实体管理器(因为两个数据库都是相同的)。

首先,我不确定这是否是最好的方法/解决方案。 而且,除此之外,我不知道如何实现这个想法(我刚刚为2个数据库找到了2个实体经理)。

如果这是一个愚蠢的问题,我很抱歉,但我现在一直在为它寻找一些解决方案。

3 个答案:

答案 0 :(得分:2)

我们使用不同的em来保存历史记录,工作正常。 代码看起来像这样。

您的配置中的某处 ...

<强> yourpath \应用\配置\ parameters.yml

parameters:
    database_driver: pdo_mysql
    database_host: site1.ru
    database_port: 3346
    database_name: db1
    database_user: roof
    database_password: jump

    database_history_driver: pdo_mysql
    database_history_host: site2.ru
    database_history_port: 10001
    database_history_name: history
    database_history_user: sea
    database_history_password: deep

    etc...

您的历史记录包中的某个 ...

/**
 * We make history!
 **/
class historyController extends Controller
{
    public function showAction($historyId)
    {
        // get secondary manager
        $emHistory = $this->getDoctrine()->getManager('history');
        // get default manager
        $em = $this->getDoctrine()->getManager('default');
    }
}

历史记录服务

中的
class HistoryBundleUtils {
    protected $em;

    public function __construct($arguments) {
        // get secondary manager
        $this->em = $arguments['entityManager']->getManager('history');
        # etc...
    }
}

答案 1 :(得分:1)

这是不可能的,每个实体管理器只能使用一个数据库连接the docs seem quite clear about it

所以我认为你将不得不使用两个EM。每个都将配置一组重复的映射。你如何使用它们的细节取决于你:

  • 您可以根据应用的需要手动选择其中一个
  • 你可以以某种方式把它抽象成一个你自己的类,它有两个EM,然后当你运行查询等时,它会担心从哪里获取数据(以及可能如何组合来自两个EM的数据)< / LI>
  • 如果真正需要两个EM的唯一活动就是归档过程本身,那很明显可以隐藏在一个类中

我想这也取决于归档数据库的重点。如果某些建筑事物需要在不同的服务器或其他任何服务器上,那么你就像上面那样陷入困境。另一方面,如果你真的只是希望旧数据不会出现在日常查询中(没有特别要求),那么最好实现某种类型的&#34;存档&#34;标志和一个教条扩展,它可以神奇地隐藏存档的物品,直到你要求它们,非常类似于SoftDeleteable

答案 2 :(得分:1)

我不知道这是不是一个好习惯,但我已经在Symfony2中成功地为两个数据库使用了一个EM。我正在处理的项目需要访问两个数据库。但是有一些限制。首先,两个数据库的database_user和_password必须相同。您可以访问这两个数据库,但只能创建(使用控制台doctrine:database:create)并编写parameters.yml中定义的表(console doctrine:schema:update)。 您可以在两个数据库上进行读取,写入,更新,删除,但需要在模型中指定第二个数据库的数据库名称,如:

@ORM\Table(name="my_other_database.my_table")

基本上,如果一个数据库已经存在且您只需要访问它,则可以将一个EM用于两个数据库。