mysql - symfony 4 中的独立数据库

标签 mysql database postgresql symfony

我正在创建一个应用程序是 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 中启用分片的任何内容?

问候,

最佳答案

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

如果你想在 Controller 中使用它,我建议将此服务绑定(bind)为 services.yaml 中的参数:

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

然后在你的 Controller 中通过 Autowiring 注入(inject)它并按预期使用它:

class FooController extends AbstractController {

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

我已经从 github 下载并运行了你的项目。事实证明,正如我在评论中已经注意到的那样,问题出在 doctrine.yaml 中实体管理器的错误配置。为了让你的程序正确工作(对我来说是这样),你创建了两个新目录(/src/Entity/First,/src/Entity/Second),将文件 First.php 和 Second.php 分别放在这些目录中,然后将 doctrine.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”选项)。这导致了与不可预测行为的冲突。事实上,由于这种冲突,它是第一个在第二类的存储库中调用的实体管理器。

关于mysql - symfony 4 中的独立数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52096949/

相关文章:

mysql - sql选择不包含某些项目的订单

php - 在 Heroku "PDOException in Connector.php line 55"(sqlite) 上部署 Laravel

c# - 使用 Dapper 和 Npgsql2 插入空值数组属性的问题

mysql - 按计数和时间范围重新组织和聚合数据

MySQL 从数据库返回新产品和二手产品的数量

php - 将PHP中的数组添加到mysql中

java - JPA冗余数据库

php - Yii2:ActiveQuery 可以返回以 SQL 查询的第一列为键的数组吗?

SQL:如何检查相关行是否存在?

sql - Postgresql:排除文本中特定字符未以空格开头的记录