2014-02-17 2 views
6

У меня есть пользователей стол и встречи стол. В таблице назначения у меня есть два идентификатора пользователя (customer_id, staff_id). Я хочу получить все встречи с именем клиента и именем персонала.Laravel Eloquent Eager Загрузка: Присоединитесь к одной и той же таблице дважды

users table 
id 
name 

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

Как вы можете видеть, я должен дважды присоединиться к таблице пользователей с таблицей встреч. Обычно я делаю это с внутренних присоединений.

Можем ли мы сделать то же самое с красноречивой загрузкой Laravel с использованием()?

Можем ли мы сделать что-то вроде:

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. 

Это конечный результат мне нужно:

appointment_id 
staff_id 
staff_name 
customer_id 
customer_name 
datetime 

У меня есть еще один вопрос, что является второй параметр в следующем запросе?

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

Спасибо!

ответ

10
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) С использованием "с":

$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) присоединяется:

$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>'; 
} 

О втором вопросе - Это для подзапросов. Посмотрите документацию: http://laravel.com/docs/eloquent#eager-loading

Смежные вопросы