Laravel连数据库核心是正确配置.env并验证连接生效,需确保PDO驱动已启用、.env字段完整(含DB_USERNAME/DB_PASSWORD)、DB_HOST不写localhost(容器/远程场景)、清除config:cache避免缓存干扰。

PHP 用 Laravel 连数据库,核心不是“怎么进”,而是配置好 .env 和验证连接是否真正生效——很多问题其实出在环境变量没加载、驱动未安装或权限/网络不通,而不是代码写错。
确认 DB_DRIVER 和扩展已就位
Laravel 不直接操作数据库,它靠 PDO 驱动。你选的数据库类型必须对应已启用的 PHP 扩展:
-
mysql或mysqlnd→ 要求pdo_mysql扩展已启用(不是mysql扩展,那个已废弃) -
pgsql→ 要求pdo_pgsql -
sqlite→ 要求pdo_sqlite,且database/database.sqlite文件可写 -
sqlsrv(SQL Server)→ 要求pdo_sqlsrv,Windows 下较稳,Linux 需额外配置 ODBC
运行 php -m | grep pdo 看输出里有没有对应模块;Laravel 启动时报 Driver not found 就先查这个。
.env 里的数据库配置项不能漏字段
常见错误是只填了 DB_HOST 和 DB_DATABASE,却忘了 DB_USERNAME、DB_PASSWORD,或者用了空密码但没写成 DB_PASSWORD=(注意等号右边为空)。完整最小集是:
立即学习“PHP免费学习笔记(深入)”;
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=your_db_name DB_USERNAME=your_user DB_PASSWORD=your_pass
如果数据库在 Docker 或远程服务器上,DB_HOST 别写 localhost ——它在容器内会走 Unix socket,应改用真实 IP 或服务名(如 mysql);DB_PORT 也别假设是 3306,先 telnet host port 确认通不通。
执行 php artisan tinker 手动测试连接
别急着跑 migration 或 model,先用交互式终端验证底层连得通:
> DB::connection()->getPdo(); # 如果报错:SQLSTATE[HY000] [2002] Connection refused → 网络或服务没起来 # 如果返回 PDO 对象 → 连接成功
也可以试一个最轻量查询:
> DB::select('SELECT 1 as ok');
# 返回 [['ok' => 1]] 表示认证、权限、语法都 OK
这里不推荐直接用 php artisan migrate 测试,因为 migration 会读取 config/database.php 并合并 .env,中间有缓存层(比如 config:cache 没清),容易误判。
本地开发时 config:cache 是个隐藏陷阱
运行过 php artisan config:cache 后,Laravel 就不再读 .env,而是读缓存的 bootstrap/cache/config.php。改了 .env 却连不上?先删缓存:
php artisan config:clear # 或直接删文件:rm bootstrap/cache/config.php
这个缓存只该在生产环境部署时生成,开发阶段开着它,等于自己给自己埋雷。
真正卡住人的,往往不是语法或命令,而是扩展没开、端口不通、.env 被缓存、或者 MySQL 用户没授远程权限(CREATE USER 'x'@'%' IDENTIFIED BY 'y' 和 GRANT ALL ON db.* TO 'x'@'%' 缺一不可)。











