【问题标题】:Symfony 4 changing databases on the flySymfony 4 动态更改数据库
【发布时间】:2018-05-07 20:52:35
【问题描述】:

我在做一个博客平台,每个博客都有自己的数据库。

我需要即时切换数据库连接。

我了解文档

http://symfony.com/doc/current/doctrine/multiple_entity_managers.html

但我想避免在配置文件中添加everyting,因为还有更多

超过 50 个数据库。

我一直在尝试使这段代码适应 symfony 4,但我无法让它工作 https://stackoverflow.com/a/9291896/9726140

谢谢

【问题讨论】:

  • >> 每个博客都有自己的数据库,为什么?
  • @FrankB 如果每个博客都被视为一个租户,为什么不呢?不仅更好,甚至建议这样拆分
  • 在不设置环境变量的情况下还有其他方法吗?并根据您的数据库使用变量设置配置。但是你必须设置 50 个环境变量。我说的对吗?
  • 是的,计划超过 50 个。

标签: php symfony


【解决方案1】:

我根据自己的情况想出了一些办法,在这种情况下,每个客户都有自己的子域。我可以利用 apache 配置的虚拟主机部分来添加一个额外的环境变量并使用它来设置数据库名称。

在阿帕奇: # ...

    SetEnv SUBDOMAIN_NAME "db_name"
</VirtualHost>

在我的 .env 中进行开发(这将在 apache config 中用于产品)基本上,只需从 URL 中删除数据库名称

DATABASE_URL=mysql://root:root@mysql:3306/

最后,在我的doctrine.yaml 参数下,我设置了一个默认值。这样,我们就不会为未配置的客户报错,并且可以为技术支持显示一个干净整洁的“必要设置”消息:

env(SUBDOMAIN_NAME): 'default_customer'

并在学说.yaml 中,将 url 的值替换为

url: '%env(resolve:DATABASE_URL)%%env(resolve:SUBDOMAIN_NAME)%'

【讨论】:

    【解决方案2】:

    也许您可以从 Controller 中尝试:

    $sql = "USE dbname";
    $stmt = $this->getDoctrine()->getManager()->getConnection()->prepare($sql);
    $stmt->execute();
    

    【讨论】:

    • 您好安德鲁,感谢您的回复。但是找不到getConnection()方法。
    • 嗨,我正在使用 symfony 3.4,该方法对我有用。
    • Symfony 4 进行了一些重大更改,使某些东西现在不存在或无法正常工作。
    猜你喜欢
    • 2019-04-08
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多