Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用多个数据库连接访问存储库和实体_Php_Mysql_Symfony - Fatal编程技术网

Php 使用多个数据库连接访问存储库和实体

Php 使用多个数据库连接访问存储库和实体,php,mysql,symfony,Php,Mysql,Symfony,我们有一个包含多个表的主数据库。根据当前使用的客户端,我们将拥有未知数量的“重复”数据库 这是如下所示的设置 亚马尔先生 doctrine: dbal: default_connection: default connections: default: driver: pdo_mysql server_version: '5.7' charset: utf8mb4 url: '%env(resolve

我们有一个包含多个表的主数据库。根据当前使用的客户端,我们将拥有未知数量的“重复”数据库

这是如下所示的设置

亚马尔先生

doctrine:
  dbal:
    default_connection: default
    connections:
      default:
        driver: pdo_mysql
        server_version: '5.7'
        charset: utf8mb4
        url: '%env(resolve:DATABASE_URL)%'
      School_A:
        driver: pdo_mysql
        server_version: '5.7'
        charset: utf8mb4
        url: 'mysql://nibbr:nibbr@127.0.0.1:3306/School_A'
      School_B:
        driver: pdo_mysql
        server_version: '5.7'
        charset: utf8mb4
        url: 'mysql://nibbr:nibbr@127.0.0.1:3306/School_B'
  orm:
    default_entity_manager: default
    entity_managers:
      default:
        connection: default
        naming_strategy: doctrine.orm.naming_strategy.underscore
        mappings:
          App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: App
      4bf40159870dc1b23c97e7906a303f39:
        connection: School_A
        naming_strategy: doctrine.orm.naming_strategy.underscore
        mappings:
          App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
      46f0618dadff645591073709906f006c:
        connection: School_B
        naming_strategy: doctrine.orm.naming_strategy.underscore
        mappings:
          App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src'
            prefix: 'App'
现在数据库已经存在

使用

 php bin/console doctrine:migrations:migrate --em=46f0618dadff645591073709906f006c
工作得非常好

但我无法切换到特定的EntityManager来操作正确的数据库。它总是使用默认值

我知道这已经涉及了很多,但没有给出真正的答案

每个数据库使用所有相同的实体和存储库。我只想更改symfony 4使用的数据库

 $rep = $this->getDoctrine()->getRepository(SchoolStudent::class,'46f0618dadff645591073709906f006c');

当我通过$rep持久化一个新条目时,无论传递了什么值,它都只使用它在doctor.yaml中遇到的第一个实体管理器和连接。除非我传递的字符串不是EntityManager名称,否则我会得到一个500错误

使用->getManager()的任何变体也会导致500错误。我对symfony还很陌生


非常感谢

我以这种方式使用了两种不同的管理器(在具有依赖注入的服务中):

在本例中,我将存储库直接注入到服务构造函数中

<service id="my_service_id" class="FQCN">
    <argument type="service">
        <service class="Doctrine\ORM\DocumentRepository">
            <factory service="doctrine.orm.46f0618dadff645591073709906f006c_entity_manager" method="getRepository"/>
            <argument>Namespace\SchoolStudent</argument>
        </service>
    </argument>
</service>

名称空间\学生

我以这种方式使用两种不同的管理器(在具有依赖项注入的服务中):

在本例中,我将存储库直接注入到服务构造函数中

<service id="my_service_id" class="FQCN">
    <argument type="service">
        <service class="Doctrine\ORM\DocumentRepository">
            <factory service="doctrine.orm.46f0618dadff645591073709906f006c_entity_manager" method="getRepository"/>
            <argument>Namespace\SchoolStudent</argument>
        </service>
    </argument>
</service>

名称空间\学生

欢迎使用Stackoverflow。您应该删除默认的实体管理器,并在应用程序上编写系统代码,以选择要使用的实体管理器。我们需要更多关于“哪个是正确的数据库”的信息。(例如:每个用户都有自己的数据库,用户选择一年,并且每年都有一个数据库,等等)感谢您的回复。我会尽力提供更多的信息。这在命令应用程序中起作用。用户将传递3个参数。其中一个参数以学校散列数据类型(哪个实体是学生/家长)的形式出现,因此在处理它时,
$em->getRepository(schoolstuent::class,$this->schoolHash)在控制器中用于选择数据库,学校哈希决定使用哪个数据库您可以使用$em->getRepository(schoolstuent::class,'school_a');对于school A和$em->getRepository(school Student::class,'school_B');对于B学校……我删除了默认设置,现在每次都只是选择A学校。即使添加
$em->getRepository(schoolstuent::class,'School_B')
仍然会返回School\u Atry$em->getRepository(schoolstuent::class,'46F0618DADF645591073709906F006C');如果它返回学校,就来吧。您应该删除默认的实体管理器,并在应用程序上编写系统代码,以选择要使用的实体管理器。我们需要更多关于“哪个是正确的数据库”的信息。(例如:每个用户都有自己的数据库,用户选择一年,并且每年都有一个数据库,等等)感谢您的回复。我会尽力提供更多的信息。这在命令应用程序中起作用。用户将传递3个参数。其中一个参数以学校散列数据类型(哪个实体是学生/家长)的形式出现,因此在处理它时,
$em->getRepository(schoolstuent::class,$this->schoolHash)在控制器中用于选择数据库,学校哈希决定使用哪个数据库您可以使用$em->getRepository(schoolstuent::class,'school_a');对于school A和$em->getRepository(school Student::class,'school_B');对于B学校……我删除了默认设置,现在每次都只是选择A学校。即使添加
$em->getRepository(schoolstuent::class,'School_B')
仍然会返回School\u Atry$em->getRepository(schoolstuent::class,'46F0618DADF645591073709906F006C');如果它返回学校