2014-01-06 71 views
1

熱切加載關係,我將如何排序依據在查詢中關係的列列?我如何排序依據()在Laravel 4

例如我有一個$ order變量,其中包含類似'title.asc'的變量,然後將其分解並通過控制器發送到模型中的查詢,並使用$ order [0]和$ order [1]但如果列在急切加載的關係表上,我怎麼能使用它?

public function scopeEvents($query, $order, $course, $supplier, $city, $venue, $eventStatus, $tutor) 
{ 
    $date = date('Y-m-d'); 

    $query->where('active', 1) 
     ->with('course', 'venue', 'supplier', 'eventType', 'eventStatus', 'tutor', 'delegates') 
     ->where('start_date', '>=', $date) 
     ->orderBy($order[0], $order[1]); 

    if (! empty($course[0])) 
    { 
     $query = $query->whereIn('course_id', $course); 
    } 

    if (! empty($supplier[0])) 
    { 
     $query = $query->whereIn('supplier_id', $supplier); 
    } 

    if (! empty($venue[0])) 
    { 
     $query->whereIn('venue_id', $venue); 
    } 

    if (! empty($event_status[0])) 
    { 
     $query->whereIn('event_status_id', $eventStatus); 
    } 

    if (! empty($tutor[0])) 
    { 
     $query->whereIn('tutor_id', $tutor); 
    } 
} 

目前我只是得到一個未找到的列,這是預期的。

+0

我正在考慮像這樣的http://pastebin.com/FgWg4A66的東西,但它有點混亂,似乎並不完全工作。它沒有錯誤,但它似乎並沒有命令他們?更可能是因爲它實際上是訂購返回的關係而不是事件本身。 –

回答

1

爲了減少加載時間,同時還能夠通過相關的表列命令,我必須預先加載與連接相結合,並且使用連接訂貨和預先加載在視圖中顯示的數據。似乎運作良好。

public function scopeEvents($query, $order, $course, $supplier, $city, $venue, $eventStatus, $tutor) 
{ 
    $date = date('Y-m-d'); 

    $query->where('active', 1) 
     ->with('course', 'venue', 'supplier', 'eventType', 'eventStatus', 'tutor', 'delegates') 
     ->leftJoin('courses', 'courses.id', '=', 'events.course_id') 
     ->leftJoin('suppliers', 'suppliers.id', '=', 'events.supplier_id') 
     ->leftJoin('venues', 'venues.id', '=', 'events.venue_id') 
     ->leftJoin('event_types', 'event_types.id', '=', 'events.event_type_id') 
     ->leftJoin('event_statuses', 'event_statuses.id', '=', 'events.event_status_id') 
     ->leftJoin('tutors', 'tutors.id', '=', 'events.tutor_id') 
     ->select('events.*', DB::raw("concat(tutors.first_name,' ',tutors.last_name) as tname"), 'event_statuses.status', 'event_types.type', 'venues.name as vname', 'suppliers.name as sname', 'courses.title', 'venues.city') 
     ->where('start_date', '>=', $date) 
     ->orderBy($order[0], $order[1]); 

    if (! empty($course[0])) 
    { 
     $query = $query->whereIn('course_id', $course); 
    } 

    if (! empty($supplier[0])) 
    { 
     $query = $query->whereIn('supplier_id', $supplier); 
    } 

    if (! empty($venue[0])) 
    { 
     $query->whereIn('venue_id', $venue); 
    } 

    if (! empty($event_status[0])) 
    { 
     $query->whereIn('event_status_id', $eventStatus); 
    } 

    if (! empty($tutor[0])) 
    { 
     $query->whereIn('tutor_id', $tutor); 
    } 
}