【问题标题】:Separate databases in symfony 4symfony 4 中的独立数据库
【发布时间】:2018-08-30 12:21:00
【问题描述】:

我正在创建一个应用程序是symfony (4.1),我想在一个单独的数据库中单独进行身份管理。

然后我将 doctine 配置如下

doctrine:
  dbal:
    default_connection: default
    connections:
      default:
        url: '%env(DATABASE_URL)%'
        driver: 'pdo_mysql'
        mapping_types:
          enum: string
      identity:
        url: '%env(IDENTITY_DATABASE_URL)%'
        driver: 'pdo_pgsql'
  orm:
    default_entity_manager: default
    entity_managers:
      default:
        connection: default
        mappings:
          App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'

      identity:
        auto_mapping: true
        connection: identity
        mappings:
          ACL:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity/Identity'
            prefix: 'App\Entity\Identity'

contoller 中,我想从identity 数据库中检索users

有办法在用

$this->getDoctrine()->getRepository(User::class, 'identity')->findAll();

运行 php bin/console server:run 看来,以下代码使用 default 数据库,而不是 identity 数据库。

我是否错过了在 symfony 中启用分片的任何内容?

问候,

【问题讨论】:

  • 可能是因为orm:identity:connectiondbal 连接应该是acl 而不是identity不存在)。
  • @gp_sflover 复制/粘贴错误,确实是身份

标签: mysql database postgresql symfony


【解决方案1】:

您必须注入适当的实体管理器(即身份)。对应的服务名称为“doctrine.orm.identit_entity_manager”。

如果您想在控制器中使用它,我建议将此服务绑定为 services.yaml 中的参数:

App\Controller\FooController:
        bind:
            $identityManager: '@doctrine.orm.identity_entity_manager'

然后在您的控制器中通过自动装配注入它并按预期使用它:

class FooController extends AbstractController {

/**
 * @Route("/bar", name="bar")
 */
public function bar($identityManager) {
    ...
    $identityManager->getRepository(User::class)->findAll();
    ...
}

我已经从 github 下载并运行了你的项目。事实证明,正如我在我的 cmets 中已经注意到的那样,问题是在教义.yaml 中的实体管理器配置错误。为了让您的程序正常工作(它对我有用),您创建了两个新目录(/src/Entity/First、/src/Entity/Second),将文件 First.php 和 Second.php 分别放在这些目录中,然后将您在教义.yaml 中的配置更改为

doctrine:
dbal:
    default_connection: default
    connections:
        default:
            url: '%env(DATABASE_URL)%'
            driver: 'pdo_mysql'
            server_version: '5.7'
            charset: utf8mb4
        second:
            url: '%env(SECOND_DATABASE_URL)%'
            driver: 'pdo_mysql'
            server_version: '5.7'
            charset: utf8mb4

orm:
    default_entity_manager: default
    entity_managers:
        default:
            connection: default
            mappings:
                Main:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity/First'
                    prefix: 'App\Entity\First'
                    alias: First
        second:
            connection: second
            mappings:
                Second:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity/Second'
                    prefix: 'App\Entity\Second'
                    alias: Second

你可以走了。

问题在于您将两个实体管理器都配置为处理相同的实体(通过 orm 部分中的“dir”和“prefix”选项)。这导致与不可预测的行为发生冲突。实际上,由于这种冲突,它是在 Second 类的存储库中调用的第一个实体管理器。

【讨论】:

  • 感谢这个想法,但对我来说结果相同 ************************ SQLSTATE[42S02]: Base table or未找到视图:1146 表 'xxxxxx.users' 不存在“在 /home/waghanza/workspace/pandacraft/v2/api/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php 行 62
  • 您能否通过 phpPgAdmin 或类似的方式检查用户表是否确实存在?
  • 是的,它确实存在,当试图收集用户集合时(通常在 pg 数据库中),我有一个 mysql 错误 => 所以我知道使用默认连接的原则(一个 mysql 连接)
  • 能否通过dump($identityManager);调试你使用的实体管理器?
  • 我有一个失败 [严重] 未捕获的 PHP 异常 RuntimeException: "Controller "App\Controller\MenuController::index()" 可能要求您为 "$identityManager" 参数提供一个值,它我这边配置错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2018-04-07
相关资源
最近更新 更多