Упорядочивание результатов из связанных таблиц в 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;
}

Если вы посмотрите на мой EventsController в методе getOrder:

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

Вы можете видеть, что я сохраняю порядок в сеансе, а затем в своей модели использую его для сортировки порядка результатов.

Есть ли способ сделать это в Eloquent так, как мне нужно?


person Gareth Daine    schedule 10.05.2013    source источник
comment
Eloquent не использует объединения для своих отношений, поэтому я не верю, что вы сможете добиться одинакового порядка в любом из объединенных столбцов, и при этом вы не получите ни одного результата с предварительно объединенными результатами.   -  person Phill Sparks    schedule 10.05.2013
comment
Есть идеи, как можно было бы добиться чего-то подобного с помощью Eloquent, или это нужно было бы делать с помощью внешнего интерфейса?   -  person Gareth Daine    schedule 10.05.2013
comment
Вы всегда можете преобразовать объект в массив и использовать соответствующие функции сортировки массива php. Я бы также предложил проверить плагин jquery TableSorter. Было бы намного быстрее, и ваши пользователи javascript, вероятно, оценят это.   -  person user1669496    schedule 11.05.2013
comment
Да, попробовал tablesorter, и это было бы здорово, за исключением того факта, что, поскольку мой объект разделен в представлении по неделям, начиная с начала недели, он портится.   -  person Gareth Daine    schedule 11.05.2013


Ответы (1)


Вы знаете, что можете просто добавить join() к красноречию, верно?

Итак, например, если у вас есть пользователи, и у каждого пользователя есть несколько сообщений в блогах (т. е. у пользователя есть_много блогов), вы можете вывести красноречивую модель, показывающую имя пользователя и название блога, упорядоченные по названию блога, следующим образом:

user::join('blogs', 'blogs.id','=','users.blog_id')
      ->order_by('blogs.title', 'asc')
      ->select(array('users.username', 'blogs.title'))
      ->paginate(10);
person Gaz_Edge    schedule 13.05.2013
comment
Эй, Газ, да, разобрался, делая это именно так, ну очень похоже. :-) - person Gareth Daine; 14.05.2013