Symfony 4 Repository中使用多数据库执行SQL请求的问题
在Symfony Repository中使用多数据库连接的解决方案
你遇到的问题很常见——默认情况下,Symfony会自动注入默认的EntityManager到Repository中,所以你当前拿到的是default连接(对应DATABASE1)的实例。要在Repository里使用DATABASE2(也就是你配置的customer连接),可以通过以下两种方法实现:
方法一:注入指定的EntityManager
如果你的Repository需要用到ORM相关功能(比如实体映射、持久化操作),推荐这种方式:
步骤1:配置依赖注入
在/config/services.yaml中,为你的Repository显式注入customer对应的EntityManager:
App\Repository\YourRepositoryName: arguments: $em: '@doctrine.orm.customer_entity_manager'
注意替换
YourRepositoryName为你实际的Repository类名
或者,如果你有多个Repository需要用到这个连接,可以用参数绑定让注入更灵活:
services: _defaults: bind: $customerEntityManager: '@doctrine.orm.customer_entity_manager'
步骤2:修改Repository构造函数
如果用了参数绑定,构造函数可以更清晰地命名参数:
use Doctrine\ORM\EntityManagerInterface; class YourRepositoryName { private EntityManagerInterface $em; public function __construct(EntityManagerInterface $customerEntityManager) { $this->em = $customerEntityManager; } /** * @param string $code * @return mixed[] * @throws \Doctrine\DBAL\Exception */ public function getData(string $code) { // 现在$this->em对应的是DATABASE2的EntityManager $sql = "SELECT * FROM api"; $conn = $this->em->getConnection(); $query = $conn->prepare($sql); $query->execute(); return $query->fetchAll(); } }
方法二:直接注入数据库连接
如果你的Repository只需要执行原生SQL(不需要ORM功能),直接注入指定的Connection实例会更高效:
步骤1:配置依赖注入
在/config/services.yaml中注入customer连接:
App\Repository\YourRepositoryName: arguments: $connection: '@doctrine.dbal.customer_connection'
步骤2:修改Repository代码
use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception; class YourRepositoryName { private Connection $connection; public function __construct(Connection $connection) { $this->connection = $connection; } /** * @param string $code * @return mixed[] * @throws Exception */ public function getData(string $code) { $sql = "SELECT * FROM api"; $query = $this->connection->prepare($sql); $query->execute(); return $query->fetchAll(); } }
小提示
- PHP方法名推荐使用小驼峰命名(比如
getData而非Getdata),符合PSR规范 - 记得导入对应的命名空间(比如
Doctrine\DBAL\Exception代替DBALException,因为Symfony 5+后命名空间有调整)
内容的提问来源于stack exchange,提问作者Nearyuk
相关产品推荐
相关产品推荐

