Symfony4使用Repository->findAll时出现未知数据库错误求助
解决Symfony 4中Doctrine findAll()提示未知数据库的问题
我一眼就看出问题出在你的Doctrine配置优先级上——Symfony里Doctrine的url配置参数优先级远高于单独设置的dbname、user等参数,而你的DATABASE_URL环境变量是空的,这就导致Doctrine根本没用到你指定的autotrader数据库,反而去连接了一个默认的(不存在的)数据库。
下面是具体的修复步骤:
方案一:使用环境变量(推荐,符合Symfony最佳实践)
Symfony 4推荐通过环境变量管理数据库配置,这样不同环境(开发/测试/生产)可以轻松切换配置:
- 打开项目根目录下的
.env文件,找到DATABASE_URL这一行,替换成你的数据库信息:
DATABASE_URL=mysql://root:secret@127.0.0.1:3306/autotrader?serverVersion=5.7&charset=utf8mb4
- 保留你原来的Doctrine配置即可,因为
url参数会自动解析出所有数据库连接信息,不需要再单独设置dbname、host等(当然保留也没关系,但url会覆盖它们)。
方案二:直接使用硬编码参数(不推荐,仅用于快速测试)
如果你暂时不想用环境变量,可以直接移除url配置,让Doctrine使用你手动设置的参数:
修改config/packages/doctrine.yaml,删除或注释掉url: '%env(resolve:DATABASE_URL)%'这一行:
parameters: env(DATABASE_URL): '' doctrine: dbal: driver: 'mysql' server_version: '5.7' charset: 'utf8mb4' dbname: 'autotrader' host: '127.0.0.1' port: 3306 user: 'root' password: 'secret' # 注释或删除下面这行 # url: '%env(resolve:DATABASE_URL)%' orm: auto_generate_proxy_classes: '%kernel.debug%' naming_strategy: doctrine.orm.naming_strategy.underscore auto_mapping: true mappings: App: is_bundle: false type: annotation dir: '%kernel.project_dir%/src/Entity' prefix: 'App\Entity' alias: App
关键后续步骤
不管用哪种方案,都要清除Symfony的配置缓存,因为Symfony会缓存配置信息,尤其是在非debug模式下:
php bin/console cache:clear # 如果是生产环境,加上--env=prod参数 # php bin/console cache:clear --env=prod
另外,你可以验证一下数据库是否真的存在,以及迁移是否成功:
- 登录MySQL命令行:
mysql -u root -p
输入密码后,执行show databases;,确认autotrader数据库存在。
2. 验证数据库结构和实体是否匹配:
php bin/console doctrine:schema:validate
如果显示[OK] The mapping files are correct.和[OK] The database schema is in sync with the mapping files.,就说明没问题了。
内容的提问来源于stack exchange,提问作者Aurelio Decock
相关产品推荐
相关产品推荐

