Laravel 迁移显示现有列的列不存在

Posted

技术标签:

【中文标题】Laravel 迁移显示现有列的列不存在【英文标题】:Laravel migration shows column doesn't exist for existing columns 【发布时间】:2021-10-06 12:05:04 【问题描述】:
$users=DB::select('SELECT 
      users.id,
      users.name,
      course.id,
      course."courseUniqueName",
      skills.id,
      skills.skill,
      subjects.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'); 

我已经在迁移的 up 方法中编写了上面的代码,但是在运行迁移命令时,它显示 -

Illuminate\Database\QueryException 
SQLSTATE[42703]: Undefined column: 7 ERROR:  column course.userid does not exist at character 294
HINT:  Perhaps you meant to reference the column "course.userId".

课程表迁移文件

Schema::create('course', function (Blueprint $table) 
                $table->id();
                $table->bigInteger('userId')->unsigned();
                $table->foreign('userId')->references('id')->on('users');
                $table->string('courseDisplayName');
                $table->string('courseUniqueName')->unique();
                $table->string('courseAddedBy');
                $table->dateTime('createdOn');
                $table->dateTime('lastUpdated');
                $table->softDeletes();        
            );

我不知道为什么会发生此错误,因为我的“课程”表迁移中有userId 列。非常感谢任何帮助。

编辑

输出:

"id": 1,
 "name": "weeee",
 "courseUniqueName": "Frehers course",
 "skill": "swim",
 "subject": "IELTS"

查看查询

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       
      )
    ");

型号

class CourseMarketView extends Model

    use HasFactory;
    protected $table = 'course_market_view';
    protected $fillable = ['user_id','name','course_id','courseUniqueName','skill','skill_id','subject_id','subject'];

控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Models\CourseMarketView;

class CourseMarketController extends Controller

    public function getcoursebysubjectID()

        $users = CourseMarketView::all();
        dd($users);
    

【问题讨论】:

@VahidMarali 我不明白你说什么。什么是别名?您能更具体地了解如何定义别名吗? 我的错误对不起 @VahidMarali 为什么?你的回答与我的问题不相关吗? 对不起,不是 @AlexYu 谢谢。现在可以了。但它只获取idnamecoureseUniqueNameskillsubject 列的数据。它没有从 course.id,skills.idsubjects.id 列中获取数据。我的数据库中的所有这些列都有价值 【参考方案1】:

问题 A.“column course.userid 不存在”

提示:也许您的意思是引用“course.userId”列

这个问题通过使用" 来解决带有大写字母的字段名称。

$users=DB::select('SELECT 
      users.id,
      users.name,
      course.id,
      course."courseUniqueName",
      skills.id,
      skills.skill,
      subjects.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'); 
单引号查询 字段名称双引号

问题 B.id-fields

它没有从 course.id、skills.id 和 subject.id 列中获取数据

问题是4个字段被命名为id

修复它 - 使用字段别名:

$users=DB::select('SELECT 
      users.id as user_id, # note rename of the field here
      users.name,
      course.id as course_id, # and here
      course."courseUniqueName",
      skills.id as skill_id,  # and here
      skills.skill,
      subjects.id as subject_id,  # and here
      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'); 

这样id 将变成现实中的 4 个不同的字段:

user_id - 来自表 users course_id - 来自course skill_id - 来自skills subject_id - 来自`主题

根据字段重命名相应地更改应用程序代码。

【讨论】:

但是还有一个问题。我在创建视图时使用此查询。当我像你说的那样添加引号时,它显示完整的语法错误。请查看更新后的问题 将外引号更改为单引号并在字段名称周围使用双引号 虽然我成功创建了视图,但我的控制器没有从视图返回任何数据。请在我更新的问题正文中查看代码【参考方案2】:

提示是自说自话。你没有专栏userid

你的桌子上有userId

【讨论】:

但是我要怎么做才能解决这个问题呢?我在查询中正确使用了course.userId。但它正在检查course.userid。那有什么解决办法呢?

以上是关于Laravel 迁移显示现有列的列不存在的主要内容,如果未能解决你的问题,请参考以下文章

EBS FORM基本5. 值列表(LOV)

Django 迁移错误:列不存在

列不存在 Laravel 工厂

更改输入时闪亮会抛出警告:错误:无法提取不存在的列

postgres 错误:Postgresql 11.6 中的列不存在错误

Laravel orderByRaw 计数列不存在