在Eloquent和Session中排序相关表的结果

时间:2013-05-10 14:38:39

标签: sorting laravel laravel-4 eloquent

我在Laravel 4的事件模型中有以下内容。我使用QueryBuilder而不是Eloquent的原因是我需要在我的视图中的结果表中的每个列标题中都有链接,单击时,将结果排序asc或desc基于该列。

我遇到的问题是,如果我使用Eloquent,它将无法正常工作,因为大多数数据都通过关系传递到其他表,因此Eloquent无法找到所需的列/字段。

public static function getEvents($perPage = 10)
{
    $order = Session::get('event.order', 'start_date.desc');
    $order = explode('.', $order);

    $columns = array(
        'events.id as id',
        'title',
        'locations.city as city',
        'suppliers.name as supplier_name',
        'venues.name as venue_name',
        'start_date',
        'courses.price as course_price',
        'type',
        'status',
        'max_delegates as availability',
        'tutors.first_name as tutor_first_name',
        'tutors.last_name as tutor_last_name',
        'contacts.first_name as d_first_name'
    );

    $events = DB::table('events')
        ->leftJoin('courses', 'course_id', '=', 'courses.id')
        ->leftJoin('suppliers', 'supplier_id', '=', 'suppliers.id')
        ->leftJoin('locations', 'location_id', '=', 'locations.id')
        ->leftJoin('venues', 'venue_id', '=', 'venues.id')
        ->leftJoin('event_types', 'event_type_id', '=', 'event_types.id')
        ->leftJoin('event_statuses', 'event_status_id', '=', 'event_statuses.id')
        ->leftJoin('tutors', 'tutor_id', '=', 'tutors.id')
        ->leftJoin('delegate_event', 'delegate_event.event_id', '=', 'events.id')
        ->leftJoin('delegates', 'delegates.id', '=', 'delegate_event.delegate_id')
        ->leftJoin('contacts', 'delegates.contact_id', '=', 'contacts.id')->groupBy('events.id')
        ->select($columns)
        ->orderBy($order[0], $order[1])
        ->paginate($perPage);

    return $events;
}

如果你在getOrder方法中查看我的EventsController:

public function getOrder($order)
{
    Session::put('event.order', $order);
    return Redirect::back();
}

您可以看到我在会话中存储订单,然后在我的模型中使用它来对结果的顺序进行排序。

有没有办法按照我需要的方式在Eloquent中做到这一点?

1 个答案:

答案 0 :(得分:1)

你知道你可以直接添加一个连接()吗?

因此,举例来说,如果您有用户并且每个用户都有一些博客帖子(即用户has_many博客),您可以输出显示用户名和博客标题的雄辩模型,按博客标题排序,如下所示:

user::join('blogs', 'blogs.id','=','users.blog_id')
      ->order_by('blogs.title', 'asc')
      ->select(array('users.username', 'blogs.title'))
      ->paginate(10);