【问题标题】:How can I orderBy() a column in an eager loaded relationship in Laravel 4如何在 Laravel 4 中的一个急切加载关系中 orderBy() 列
【发布时间】:2014-01-06 11:10:28
【问题描述】:

如何按查询中的关系列排序?

例如,我有一个 $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);
    }
}

目前我只是得到一个未找到的列,这是意料之中的。

【问题讨论】:

  • 我一直在考虑类似pastebin.com/FgWg4A66 的内容,但它有点混乱,似乎无法完全正常工作。它没有出错,但似乎没有订购它们?很有可能是因为它实际上是对返回的关系而不是事件本身进行排序。

标签: php laravel-4 relationship eager-loading


【解决方案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);
    }
}

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2021-12-01
    • 2014-08-13
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多