Laravel运行migrate提示course表已存在的userId列不存在
问题根因
你使用的是PostgreSQL数据库,其对标识符的大小写处理有明确规则:
- 未用双引号包裹的标识符,PostgreSQL会自动转换为小写后再匹配表结构
- 单引号在SQL中仅用于标记字符串常量,不可用于包裹字段名、表名等标识符
你在迁移中定义的userId、courseUniqueName都是驼峰命名,Laravel的PostgreSQL驱动建表时会保留字段名的大小写,因此查询时必须用双引号包裹驼峰字段名才能正确匹配。你两次出现报错都是因为字段引用的符号使用错误:
- 第一次查询如果出现该报错,说明你实际执行的SQL中
userId没有正确用双引号包裹,被PostgreSQL转成小写userid后匹配不到对应字段 - 第二次创建视图的SQL中,你使用了单引号包裹
userId,PostgreSQL将其识别为字符串而非字段,触发了相同的字段不存在报错
解决方案
方案1:修正视图创建SQL的符号使用
将视图创建SQL中所有驼峰字段用双引号包裹,注意外层字符串改用单引号避免转义冲突,修正后代码如下:
DB::statement(' CREATE VIEW course_market_view AS ( SELECT users.id as user_id, users.name, course.id as course_id, course."courseUniqueName", skills.id as skill_id, skills.skill, subjects.id as subject_id, subjects.subject FROM users LEFT JOIN course ON course."userId" = users.id LEFT JOIN skills ON skills."userId" = users.id LEFT JOIN subjects ON subjects."userId" = users.id ) ');
修正后重新运行迁移即可正常创建视图,后续调用模型查询也不会再触发字段不存在报错。
方案2:遵循命名规范从根源避免问题
Laravel和PostgreSQL的默认最佳实践都是使用蛇形命名(全小写+下划线分隔)定义字段,建议你调整迁移文件的字段命名为user_id、course_unique_name这类蛇形格式,后续所有查询都不需要额外处理双引号,也能完美适配Laravel ORM的自动字段映射逻辑,减少后续维护成本。
内容的提问来源于stack exchange,提问作者user16467258
相关产品推荐
相关产品推荐

