开发阶段必须开启app_debug=true并运行php artisan config:clear,优先查看storage/logs/laravel.log定位数据库连接错误,再逐项核对.env中db_connection、db_host、db_port、db_database、db_username/db_password配置,最后用php artisan tinker执行db::connection()->getpdo()直连验证。

先确认 APP_DEBUG 是否开启
页面只显示 Whoops, looks like something went wrong. 或空白 500,基本可以断定是 APP_DEBUG=false 挡住了真实错误。开发阶段必须开,否则你连报错类型都看不到。
检查 .env 文件里这行是否为:
APP_DEBUG=true
改完后务必运行:
php artisan config:clear
否则缓存会掩盖你的修改。Apache/Nginx 重启不是必须的,但 PHP-FPM 进程如果长期未重启,有时也会读取旧配置。
直接查 storage/logs/laravel.log 最后几行
别猜,别跳进代码里翻,先打开 storage/logs/laravel.log。90% 的连接类报错会在日志顶部或末尾明确写出错误类型,比如:
-
SQLSTATE[HY000] [1045] Access denied for user→ 用户名/密码错或权限不足 -
SQLSTATE[HY000] [2002] No such file or directory→DB_HOST=localhost导致 PHP 尝试走 Unix socket,但 MySQL 没配 socket 路径 -
Connection refused→ 数据库服务根本没起来,或DB_PORT填错了
注意看日志里紧挨着错误信息的那行:它通常会标出触发位置,例如 at /vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70 —— 这说明问题出在连接器初始化阶段,还没到你的模型或查询逻辑。
逐项核对 .env 中的 DB_* 配置
.env 是唯一可信源,config/database.php 里的值只是 env() 的兜底,默认不生效。重点盯这五个键:
-
DB_CONNECTION:填mysql还是pgsql?大小写敏感,不能写成MySQL -
DB_HOST:本地开发建议统一用127.0.0.1,避免localhost引发 socket 路径歧义 -
DB_PORT:MAMP 默认是8890,Docker 可能是3306,XAMPP 常用3306—— 必须跟实际服务端口一致 -
DB_DATABASE:数据库名要提前在 MySQL 里手动创建好,Laravel 不会自动建库 -
DB_USERNAME和DB_PASSWORD:确认用户有该库的SELECT/INSERT/UPDATE/DELETE权限,仅CREATE不够
改完 .env 后,再跑一次 php artisan config:clear。别信“我刚改了,应该生效了”——缓存不清理,env() 读的还是旧值。
用 php artisan tinker 手动测试连接
绕过 Web 请求链路,直连验证最可靠:
php artisan tinker
进入后执行:
DB::connection()->getPdo();
如果返回一个 PDO 实例,说明连接通了;如果抛出异常,错误信息就是最终真相。常见失败反馈:
-
SQLSTATE[HY000] [1045]→ 凭据错误,回退去查DB_USERNAME/DB_PASSWORD -
SQLSTATE[HY000] [2002]→DB_HOST或DB_PORT不可达,用telnet 127.0.0.1 3306测试端口 -
InvalidArgumentExceptionwith message 'Database not configured' →DB_CONNECTION值为空或拼错,导致 Laravel 找不到对应连接器
这个步骤能排除路由、中间件、模型等干扰,把问题锁定在「底层连接」本身。很多所谓“模型报错”,其实只是连接失败后,Eloquent 在尝试获取连接时抛出的二次异常。
真正卡住人的,往往不是报错内容本身,而是日志没开、缓存没清、或者以为改了 .env 就万事大吉——结果 config:clear 忘了跑,白调半天。











