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
相关产品推荐
相关产品推荐

