You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel调用Listing::all()报SQLSTATE[HY000][2002]错误,迁移异常

解决Laravel连接Docker部署MariaDB出现SQLSTATE[HY000] [2002]错误的方案

核心问题分析

本地mysql命令行可正常连接,但Laravel(含Sail命令)报错,本质是Docker容器间网络通信配置不匹配,或Laravel连接参数错误导致无法定位数据库服务。

1. 修正.env文件的数据库连接参数

打开项目根目录.env,调整以下配置:

  • DB_HOST:不要用127.0.0.1或localhost,改用docker-compose.yml中定义的数据库服务名(如mariadb或mysql)
  • DB_SOCKET:直接注释该参数,Docker容器间采用TCP连接,无需本地socket

示例正确配置:

DB_CONNECTION=mysql
DB_HOST=mariadb # 对应docker-compose.yml中的服务名称
DB_PORT=3306
DB_DATABASE=你的数据库名
DB_USERNAME=数据库用户名
DB_PASSWORD=数据库密码
# DB_SOCKET=/path/to/socket # 注释此行

2. 检查docker-compose.yml的数据库服务配置

确保数据库服务与Laravel服务处于同一网络,端口映射正确:

services:
  mariadb:
    image: mariadb:10.11.2
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 你的密码
      MYSQL_DATABASE: 你的数据库名
      MYSQL_USER: 用户名
      MYSQL_PASSWORD: 密码
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
    networks:
      - sail # 必须和Laravel服务的网络一致

3. 清除Laravel配置缓存

执行命令刷新配置:

sail artisan config:clear
sail artisan cache:clear

4. 验证Docker容器间连通性

进入Laravel容器,测试与数据库服务的网络连通性:

sail shell
ping mariadb # 替换为你的数据库服务名,能ping通则网络正常

5. 检查database.php配置冗余

打开config/database.php,确保mysql连接参数均通过env()读取,无硬编码值:

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''), # 不要硬写socket路径
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
],

6. 重启Docker服务栈

若以上配置均正确仍报错,重启服务:

sail down
sail up -d

内容的提问来源于stack exchange,提问作者LaZoR_Bear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:55:20