Laravel cannot retrieve data from multiple model with Ajax

Hi I am beginner with Ajax at the Laravel. I wanted to fetch data with Laravel Eagerload function to my blade modal.

This is my Expenses Model

protected $fillable = [
    'name',
    'surname',
    'email',
    'password',
    'status',
    'role',
];

protected $hidden = [
    'password',
    'remember_token',
];

public function Expense () {

    return $this->hasMany(ExpensesModel::class);
}

This is my Expenses Model `

{ use HasFactory;

protected $table = 'expenses'; 

protected $fillable = [
    'id',
    'emp_id',
    'expense_input_date',
    'expense_type',
    'expense_category',
    'reason',
    'status'

];



public function UserExpense () {

    return $this->belongsTo(User::class,   'emp_id' );
} 

My controller

This is My controller function
  public function edit (Request $request) {

        $req_id = array('id' => $request->id);
    
        if($request->ajax()) { 
           
            $employee  = ExpensesModel::with('UserExpense')->where('id' ,$req_id)->first();
           
            return response()->json($employee);
          
        }
     
    } 

This is my blade script
` 

 function editFunc(id){
    $.ajax({
    type:"POST",
    url: "{{ url('/expenses/advancedtable/edit') }}",
    data: { id: id },
    dataType: 'json',

  
    success: function(res){
    $('#EmployeeModal').html("Edit Employee");
    $('#employee-modal').modal('show');
    $('#id').val(res.id);   
    $('#emp_id').val(res.name);
    $('#expense_input_date').val(res.expense_input_date);
    $('#expense_type').val(res.expense_type); 
    $('#expense_category').val(res.expense_category);
    $('#expense_slip_no').val(res.expense_slip_no);
    $('#expense_amount').val(res.expense_amount);
    $('#currency').val(res.currency);
    $('#description').val(res.description);


}
});
}  

I tried everyting but it does not work. I wanted to retrive user name from User Model by using foreign key on the Expenses model emp_id.

is there something I missed somewhere can you help me with this.

Thank you.

Upvotes: 0

Views: 127

Answers (1)

Akash Patel
Akash Patel

Reputation: 86

Here how its work. First of all change relationship in your User and Expenses model like this.

// User Model
public function userExpense() {
  return $this->hasMany(ExpensesModel::class,'emp_id','id');
}

// ExpensesModel
public function user() {
  return $this->hasOne(User::class,'id','emp_id');
}

Then change your controller function.

// controller function
public function edit (Request $request) {
  $req_id = $request->id;  
  $employeeExpense = ExpensesModel::with('user')->where('id' ,$req_id)->first();
  return response()->json($employeeExpense);
}

Then change your ajax sucess function.

// ajax sucsess function
success: function(res) {
  console.log(res); // to view your response from controller in webbrowser's console
  $('#EmployeeModal').html("Edit Employee");
  $('#employee-modal').modal('show');
  $('#id').val(res.id);   
  $('#emp_id').val(res.user.name); // it will print user name
  $('#expense_input_date').val(res.expense_input_date);
  $('#expense_type').val(res.expense_type); 
  $('#expense_category').val(res.expense_category);
  $('#expense_slip_no').val(res.expense_slip_no);
  $('#expense_amount').val(res.expense_amount);
  $('#currency').val(res.currency);
  $('#description').val(res.description);
}

when you use 'with' eloqunt method it will add relationship function name to your query result, so you want to get user details then you should be do like res.user.userfield this is applicable for hasOne only.

For other relationship you will refer to this https://laravel.com/docs/9.x/eloquent-relationships

Upvotes: 0

Related Questions