【问题标题】:Working with 2 databases and just one entity manager in Symfony2在 Symfony2 中使用 2 个数据库和一个实体管理器
【发布时间】:2014-11-25 18:36:16
【问题描述】:

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

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

如果这是一个愚蠢的问题,我很抱歉,但我已经为它寻找解决方案 2 天了。

【问题讨论】:

  • 基本上你不能使用两个数据库和一个管理器。

标签: symfony orm doctrine entitymanager


【解决方案1】:

我们使用 distinct em 来保存历史记录,效果很好。 代码如下所示。

某处在您的配置中...

yourpath\app\config\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...
    }
}

【讨论】:

    【解决方案2】:

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

    所以我认为您将无法使用两个 EM。每个都将配置有一组重复的映射。但是,您如何使用它们的细节取决于您:

    • 您可以根据应用程序的需要手动选择其中一个
    • 您可以以某种方式将其抽象为您自己的具有两个 EM 的类,然后当您运行查询等时,它会担心从哪里获取数据(以及可能如何组合来自两个 EM 的数据)
    • 如果真正需要两个 EM 的唯一活动是存档过程本身,那么将其隐藏在一个类中是显而易见的

    我想这也取决于归档数据库的意义。如果它是一些架构上的东西,比如它需要在不同的服务器上或其他什么东西上,那么你就会像上面那样卡住。另一方面,如果您真的只是希望旧数据不出现在日常查询中(没有特别要求),那么最好实现某种“归档”标志和 Doctrine Extension神奇地隐藏存档的项目,直到你要求它们,非常类似于SoftDeleteable

    【讨论】:

    • 关于文档,我已经阅读了几次,然后才用我的问题打扰您。尽管如此,我似乎并不清楚我不能让它工作。 @musaya 说它可以工作(对他有用)。无论如何,您的解决方案看起来对我的问题非常好,我很感激。感谢您的帮助。
    【解决方案3】:

    我不知道这是否是一个好习惯,但我一直在 Symfony2 中成功地将一个 EM 用于两个数据库。我正在进行的项目需要访问两个数据库。但是有一些限制。首先,两个数据库的 database_user 和 _password 需要相同。您可以访问这两个数据库,但您只能创建(使用控制台原则:数据库:创建)和编写在 parameters.yml 中定义的表(控制台原则:模式:更新)。 您可以在两个数据库上读取、写入、更新、删除,但您需要在模型中指定第二个数据库的数据库名称,例如:

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

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

    【讨论】:

    • 这看起来很有趣!但不要认为它适用于提问者的用例 - 每个数据库都包含一整套相同的表,您不能将其中一些放在一个 DB 中,而将一些放在另一个 DB 中,这是分开的行。你可以复制所有实体,但这听起来有点疯狂......
    • 看起来很不错。我真的认为我在 Doctrine Extension (@frumious 回答) 中找到了更适合我的案例的解决方案,但感谢您的帮助...
    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2012-08-13
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多