Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Eloquent Eager Loading : Join same table twice

I have a users table and an appointments table. In appointment table I have two user ID's (customer_id, staff_id). I want to retrieve all the appointments with customer name and the staff name.

users table
id
name

appointments table
id
staff_id(user_id)
customer_id(user_id)
datetime

As you can see, I have to join the users table twice with the appointments table. Usually I do this with inner joins.

Can we do the same thing with Laravel eloquent eager loading using with()?

Can we do something like:

appointments::with('users' * )->get();?
* Do something here to inner join users table twice, and read user1.name as staff_name,   user2.name as customer_name.

This is the final output I need:

appointment_id
staff_id
staff_name
customer_id
customer_name
datetime

I have another question, what is the second parameter in the following query?

User::with(array(
    'post'=> function() use $region {
          //what is use $region means? Can you give me an example?
     }
));

Thanks!

like image 947
stackflow Avatar asked Feb 17 '14 16:02

stackflow


People also ask

How to use eloquent join in Laravel?

Laravel Eloquent Join. Laravel JOIN eloquent returns all rows from the both table, if there are matches in the both table. Otherwise, the result is NULL. Now, demonstrates laravel eloquent join with the following examples. You can see the following example of laravel eloquent join() method: Example 1: Laravel Eloquent Join() with 2 Tables

How to join two or multiple tables in Laravel?

Note that, you can also join two or multiple tables using laravel left, rigth and cross join. Laravel JOIN eloquent returns all rows from the both table, if there are matches in the both table. Otherwise, the result is NULL.

What is eloquent Orm in Laravel?

Laravel’s ORM, called Eloquent, makes it trivial to eager load models, and even eagerly loading nested relationships. Let’s build on the Post model example and learn how to work with eager loading in a Laravel project.

How to eager load models in Laravel?

Laravel’s ORM, called Eloquent, makes it trivial to eager load models, and even eagerly loading nested relationships. Let’s build on the Post model example and learn how to work with eager loading in a Laravel project. We will work with the project setup and then go through some eager loading examples more in-depth to wrap up.


1 Answers

class T1 extends Eloquent {

    protected $table = 't1';

}

class T2 extends Eloquent {

    protected $table = 't2';

    public function customer()
    {
        return $this->belongsTo('T1','c_id');//c_id - customer id
    }
    public function staff()
    {
        return $this->belongsTo('T1','s_id');//s_id - staff id
    }
}
  1. With use "with":

    $list = \T2::with('customer')->with('staff')->get();
    foreach ($list as $row) {
        echo 'ID: '.$row->id.', customer: '.$row->customer->name.', staff: '.$row->staff->name.'<br>';
    }
    
  2. With joins:

    $list = \T2::leftJoin('t1 as customer_table', 'customer_table.id','=','t2.c_id')
         ->leftJoin('t1 as staff_table', 'staff_table.id','=','t2.s_id')
         ->select('staff_table.name as staff_name','customer_table.name as customer_name')
         ->get();
    foreach ($list as $row) {
        echo 'customer: '.$row->customer_name.', staff: '.$row->staff_name.'<br>';
    }
    

About second question - This is for subqueries. Look documentation: http://laravel.com/docs/eloquent#eager-loading

like image 181
Nostalgie Avatar answered Oct 24 '22 09:10

Nostalgie