JavaScript
x
$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');
I’ve written the above code in the up method of my migration but when running migrate command, it shows –
JavaScript
IlluminateDatabaseQueryException
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".
Course table migration file
JavaScript
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();
});
I don’t have any idea why this error occurs because i’ve the userId
column in my ‘course` table migration. Any help is much appreciated.
EDIT
Output:
JavaScript
"id": 1,
"name": "weeee",
"courseUniqueName": "Frehers course",
"skill": "swim",
"subject": "IELTS"
View Query
JavaScript
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
)
");
Model
JavaScript
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'];
}
Controller
JavaScript
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
use AppModelsCourseMarketView;
class CourseMarketController extends Controller
{
public function getcoursebysubjectID(){
$users = CourseMarketView::all();
dd($users);
}
}
Advertisement
Answer
Problem A. “column course.userid does not exist”
With
HINT: Perhaps you meant to reference the column “course.userId”
This was solved by using "
for field names with uppercased letters.
JavaScript
$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');
- Single quotes for query
- double quotes around fields names
Problem B. id
-fields
it’s not fetching the data from the columns course.id,skills.id & subjects.id
The problem is that 4 fields are named as id
.
To fix it – use field aliases:
JavaScript
$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');
This way id
will became 4 different fields as it’s in reality:
user_id
– from tableusers
course_id
– fromcourse
skill_id
– fromskills
subject_id
– from `subjects
Change application code accordingly to field renames.