Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

DDSameera's avatar

JOIN 3 tables & Find Value in Eloquent Relationship

Hello Genius , Please help me to resolve this.

User Model

  public function courses()
    {
     return $this->belongsToMany(Course::class);
    }

Course Model

 public function lesson()
    {
        return $this->hasMany(Lesson::class, 'lesson_id', 'id');
    }

    public function mainCategory()
    {
        return $this->belongsTo(MainCategory::class,'main_category_id','id');
    }


    public function subCategory()
    {
        return $this->belongsTo(SubCategory::class,'sub_category_id','id');
    }


    public function users()
    {
        return $this->belongsToMany(User::class);
    }

So it has pivot table., course_user , now i want to get "User assigned Courses" , So i used this code. its failed

$data = User::with('courses','subCategory','mainCategory')->where('users.id','=',$userId)->get();

Here is ER Diagram.

https://snipboard.io/BXHkcN.jpg

0 likes
19 replies
MichalOravec's avatar

You mean that you want to get users which have some courses?

$users = User::with(['courses','subCategory','mainCategory'])->has('courses')->get();
DDSameera's avatar

@michaloravec Normally, we assigned specific courses for some users.

Eg : Spoken English course assigneed to David, Grade_05 is Main Category, English is sub category,Spoken English is course name

yes, i want to get users which have assigned course.

DDSameera's avatar

@michaloravec , i used it, but i got this message

{message: "Call to undefined relationship [subCategory] on model [App\Models\User].",…}
exception: "Illuminate\Database\Eloquent\RelationNotFoundException"
file: "C:\wamp64\www\lms\vendor\laravel\framework\src\Illuminate\Database\Eloquent\RelationNotFoundException.php"
line: 34
message: "Call to undefined relationship [subCategory] on model [App\Models\User]."
trace: [{file: "C:\wamp64\www\lms\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php",…},…]
MichalOravec's avatar

subCategory and mainCategory adre relationships on Course model so

$users = User::with(['courses' => function ($query) {
    $query->with(['subCategory', 'mainCategory']);
}])->has('courses')->get();
1 like
DDSameera's avatar

@michaloravec , so far so good.

I want to get specific user's records

so i used this query. it gives me null array

 $users = User::with(['courses' => function ($query) {
                $query->with(['subCategory', 'mainCategory']);
            }])->has('courses','=',$userId)->get();
MichalOravec's avatar
Level 75

To retrieve a specific user.

$user = User::with(['courses' => function ($query) {
    $query->with(['subCategory', 'mainCategory']);
}])->findOrFail($userId);
1 like
DDSameera's avatar

okay . i used following one. is that also correct ?

  $users = User::with(['courses' => function ($query) {
                $query->with(['subCategory', 'mainCategory']);
            }])->where('users.id','=',$userId)->get()->toArray();

MichalOravec's avatar

With ->where('users.id','=',$userId)->get() you get a collection but only with one user, because id is unique.

In that case is better to have just

$user = User::with(['courses' => function ($query) {
    $query->with(['subCategory', 'mainCategory']);
}])->findOrFail($userId);

By the way instead of

->where('users.id', '=', $userId)

It could be just

->where('id', $userId)
1 like
DDSameera's avatar

@michaloravec , Hey ! Genius

Now i want to get Sub Category details . So I tried to get it like this . but its failed

  $data = User::with(['courses' => function ($query) {
                $query->with(['subCategory', 'mainCategory']);
            }])->findOrFail($userId);


            $courses =$data->courses;



            dd( $courses-> subCategory);

{message: "Property [subCategory] does not exist on this collection instance.", exception: "Exception",…}
exception: "Exception"
file: "C:\wamp64\www\lms\vendor\laravel\framework\src\Illuminate\Collections\Traits\EnumeratesValues.php"
line: 865
message: "Property [subCategory] does not exist on this collection instance."
trace: [{file: "C:\wamp64\www\lms\app\Http\Controllers\MainCategoryController.php", line: 73,…},…]
MichalOravec's avatar

courses is a collection

$courses = $data->courses;

foreach ($courses as $course) {
    echo $course->subCategory->name; // if category has a name property, it's just an example
}
1 like
DDSameera's avatar

@michaloravec ,Sorry to bother you

I want to get main category full object. How could i do that ?

   $userId = "1";

            $userAssignedCourses = User::with(['courses' => function ($query) {
                $query->with(['subCategory', 'mainCategory']);
            }])->findOrFail($userId);

$userAssignedCourses = $userAssignedCourses->courses;

            foreach ($userAssignedCourses as $uac) {
                $userAssignedMainCat= $uac->mainCategory;
               
            }

         
MichalOravec's avatar

Each course has their own main category. So it can't be just one.

$mainCategories  = $data->courses->pluck('mainCategory'); // it will be a collection of main categories
1 like
DDSameera's avatar

Sorry i didn't get that . i want to get "All Main Categories" in this nature.

Currently i used this option . are there any professional way to do this ?

            $data = [];
            foreach ($userAssignedCourses as $uac) {
                $userAssignedMainCat= $uac->mainCategory;
                array_push($data,$userAssignedMainCat);
            }
MichalOravec's avatar

I think this will work

$mainCategories = $data->courses->pluck('mainCategory');
DDSameera's avatar

code

//Get Assigned Users Courses
                $userAssignedCourses = User::with(['courses' => function ($query) {
                    $query->with(['subCategory', 'mainCategory']);
                }])->findOrFail($userId);

                $userAssignedCourses = $userAssignedCourses->courses;

                $data = $userAssignedCourses->courses->pluck('mainCategory');

error

message: "Property [courses] does not exist on this collection instance.", exception: "Exception",…}
exception: "Exception"
file: "C:\wamp64\www\lms\vendor\laravel\framework\src\Illuminate\Collections\Traits\EnumeratesValues.php"
line: 865
message: "Property [courses] does not exist on this collection instance."
trace: [{file: "C:\wamp64\www\lms\app\Http\Controllers\MainCategoryController.php", line: 48,…},…]
MichalOravec's avatar

In this case

$userAssignedCourses = User::with(['courses' => function ($query) {
    $query->with(['subCategory', 'mainCategory']);
}])->findOrFail($userId);

$userAssignedCourses = $userAssignedCourses->courses;

$data = $userAssignedCourses->pluck('mainCategory');
DDSameera's avatar

@michaloravec fixed. i used this code. Thanks !!!

 $data = $userAssignedCourses->courses->pluck('mainCategory');

Please or to participate in this conversation.