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

Laravel 9连接Oracle数据库遇ORA-00904错误:EMAIL标识符无效

解决ORA-00904: "EMAIL": invalid identifier 错误

原因分析

这个错误的核心是Oracle数据库中USERS表不存在名为EMAIL(或大小写不匹配的email)的字段,或者Laravel模型的字段映射配置有误。Oracle默认会将未加双引号的标识符(表名、字段名)转换为大写,而Laravel默认使用小写字段名进行查询,导致匹配失败。

解决步骤

1. 确认数据库表字段

登录Oracle数据库,执行以下SQL检查USERS表的字段:

SELECT column_name FROM user_tab_columns WHERE table_name = 'USERS';

查看结果中是否存在EMAIL字段(Oracle返回的字段名默认是大写)。如果不存在,需要添加该字段;如果字段名是其他名称(比如USER_EMAIL),则需要调整Laravel模型的配置。

2. 调整Laravel User模型的字段映射

如果数据库字段是大写(比如EMAIL),可以在app/Models/User.php中做如下调整:

// 方法一:关闭蛇形命名转换(适用于字段名和模型属性名一致,仅大小写差异)
protected $snakeAttributes = false;

// 方法二:明确指定表名和可填充字段
protected $table = 'USERS';
protected $fillable = [
    'NAME',
    'EMAIL',
    'PASSWORD',
];

// 可选:设置属性访问器/修改器适配字段大小写
public function getEmailAttribute($value)
{
    return $this->attributes['EMAIL'];
}

public function setEmailAttribute($value)
{
    $this->attributes['EMAIL'] = $value;
}

3. 调整认证逻辑的查询字段

在config/auth.php中确保认证配置匹配数据库字段:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
        'table' => 'USERS', // 明确指定大写表名
    ],
],

也可以在User模型中重写认证字段方法:

public function getAuthIdentifierName()
{
    return 'EMAIL'; // 对应数据库的大写字段名
}

4. 检查Yajra OCI8配置

确保config/database.php中的Oracle连接配置正确开启标识符引用:

'oracle' => [
    'driver' => 'oracle',
    'host' => env('DB_HOST', ''),
    'port' => env('DB_PORT', '1521'),
    'database' => env('DB_DATABASE', ''),
    'username' => env('DB_USERNAME', ''),
    'password' => env('DB_PASSWORD', ''),
    'charset' => env('DB_CHARSET', 'AL32UTF8'),
    'quoting' => true, // 开启标识符引用,避免大小写匹配问题
],

验证

修改完成后,执行以下命令清除缓存:

php artisan config:clear
php artisan cache:clear

重新测试认证接口,确认错误是否消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:55:25