多数据库连接访问仓库与实体:Symfony 4无法切换EntityManager
嘿,作为Symfony新手碰到多EntityManager切换的问题确实头疼,我来帮你捋捋!
首先看你贴的doctrine.yaml配置,我发现一个明显的问题:对应School_B的那个EntityManager(46f0618dadff645591073709906f006c)的映射配置不对。你看它的mappings部分:
mappings: App: is_bundle: false type: annotation dir: '%kernel.project_dir%/src' prefix: 'App'
而默认和School_A的EM都是指向src/Entity目录,前缀是App\Entity。这个错误会导致Symfony无法正确识别该EM对应的实体类范围,自然没法正常切换,只能 fallback 到默认连接。
第一步:修正映射配置
把School_B对应的EM映射改成和其他EM一致:
46f0618dadff645591073709906f006c: connection: School_B 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
第二步:清除缓存(非常重要!)
Symfony会缓存配置文件,修改后一定要清缓存,不然新配置不会生效:
php bin/console cache:clear --env=dev
第三步:正确切换EntityManager的姿势
别用getRepository第二个参数指定EM名称了,先直接获取目标EntityManager,再通过它拿Repository,这样更直观也更容易排查问题:
// 先获取指定的EntityManager $em = $this->getDoctrine()->getManager('46f0618dadff645591073709906f006c'); // 再通过这个EM获取Repository $studentRepo = $em->getRepository(SchoolStudent::class); // 接下来的持久化操作都用这个EM $student = new SchoolStudent(); // ... 设置属性 $em->persist($student); $em->flush();
如果调用getManager还是报500,先检查那个长字符串的EM名称有没有拼写错误——复制粘贴的时候很容易多打少打字符,一定要和doctrine.yaml里的完全一致。
额外验证
你可以写个简单的查询测试,确认是不是操作了School_B数据库:
$em = $this->getDoctrine()->getManager('46f0618dadff645591073709906f006c'); $students = $em->createQuery('SELECT s FROM App\Entity\SchoolStudent s')->getResult(); // 打印结果或者看数据库,确认是不是来自School_B的数据
按这个步骤来,应该就能解决你无法切换数据库的问题了!
内容的提问来源于stack exchange,提问作者Jason Chadwick
相关产品推荐
相关产品推荐

