laravel eloquent relation for many tables

Viewed 56

I am going to join 4 eloquent models using belongTo, hasMany, .... in laravel.

$result = \DB::select(
        'ca.*',
        array(DB::expr('CONCAT(u.first_name, " ", u.last_name)'), 'user'),
        array(DB::expr('CONCAT(u.first_name, " ", u.last_name)'), 'full_name'),
        array('u.id','user_id'),
        array('d.name','department_name'),
        array('d.clean_name','department_clean_name'),
        array('d.id','department_id'),
        array('u.extension','user_extension'),
        array('u.mobile','user_mobile'),
        array('u.email','email')
    )
        ->from(array('case_assignments', 'ca'))
        ->join(array('departments', 'd'), 'left')->on('d.id','=','ca.department_id')
        ->join(array('users', 'u'), 'left')->on('u.id','=','ca.user_id')
        ->where('case_id','=', $case_id)
        ->get();

How can i change this to laravel eloquent relations?

2 Answers

Use relationships for this. In CaseAssigment model add these 2 records

public function user() {
    return $this->belongsTo(User::class);
}

public function department() {
    return $this->belongsTo(Department::class);
}

And the query

$result = CaseAssigment::query()
    ->with([
        'departament' => function($departaments){
            $departament->select('id', 'name', 'clean_name');
        },
        'user' => function($users){
            $user->select('id', DB::raw('CONCAT(first_name, last_name) AS full_name'), 'extension', 'mobile', 'email');
        }
    ])
    ->where('case_id','=', $case_id)
    ->get();

I think you have one department and one user on CaseAssigment. If there are a lot of them, then tell me I will rewrite the request

Try this,

CaseAssignment Model:-

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class CaseAssignment extends Model
{
    public function department()
    {
        return $this->BelongsTo('App\Models\Department','department_id');
    }
    public function user()
    {
        return $this->BelongsTo('App\User','user_id');
    }
}

Department Model:-

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Department extends Model
{
   public function caseAssignments()
    {
        return $this->hasMany('App\Models\CaseAssignment');
    }
}

User Model:-


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
   public function caseAssignments()
    {
        return $this->hasMany('App\Models\CaseAssignment');
    }
}

In Controller:-

$result = CaseAssignment::with('department','user')->where('case_id','=', $case_id)
        ->get();

dump($result->department->name);
dump($result->department->clean_name);
dump($result->department->id);
dump($result->user->extension);
dump($result->user->mobile);
dump($result->user->email);
dump($result->user->first_name.' '.$result->user->last_name);
dd($result);

Related