Laravel 4.2 Сортировка по красноречивым проблемам отношений

Я работаю с таблицей данных, которую я вывожу из различных отношений.

Большая часть данных поступает из таблицы meters с моделью Meter, но некоторые из них извлекаются из других таблиц через отношения. Например, у меня проблема с сортировкой по таблице calibrations.

В datatable есть сортируемые столбцы, которые отлично работают. Столбцы, которые сортируются на основе других отношений, имеют соединения, поэтому они сортируются без ошибок запроса.

Все сортировки и объединения работают, кроме одного, last_calibration_date.

Нет столбца с именем last_calibration_date. На самом деле у каждого meter может быть несколько калибровок.

В модели Meter я получаю last_calibration_date из таблицы calibrations через столбец calibration_date следующим образом:

public function getLastCalibrationDateAttribute()
{
    if (isset($this->relations['calibrations']) && $this->relations['calibrations']->count())
        return $this->relations['calibrations']->sortBy('calibration_date', SORT_REGULAR, true)->first()->calibration_date->format('Y-m-d');
}

Это прекрасно работает, когда я не сортирую по столбцу last_calibration_date, но возвращает ошибку sql, если вы пытаетесь отсортировать по нему без соединения.

Вот моя попытка присоединиться:

if ($sort == 'last_calibration_date')
{
    $query->join('calibrations', 'calibrations.meter_id', '=', 'meters.id');
    $sort = 'calibrations.calibration_date';
}

Хотя это не возвращает ошибку, оно также не возвращает фактическое last_calibration_date.

Еще немного информации, таблица calibrations устроена так

calibrations
- id
- calibration_date
- next_calibration_date
- meter_id

Итак, как было сказано ранее, любой счетчик может иметь несколько калибровок.

Любые идеи о том, как я могу воспроизвести мой метод Meter в своем соединении? Или может быть другой способ сортировки по last_calibration_date?


person cookavich    schedule 04.04.2016    source источник
comment
Обновитесь до 5.2, вы в прошлом!   -  person Iftikhar uddin    schedule 04.04.2016
comment
Все равно будут те же проблемы.   -  person cookavich    schedule 05.04.2016
comment
TBH с использованием DB::raw для этого будет меньше головной боли для вас.   -  person serdar.sanri    schedule 07.04.2016
comment
@guyfawkes, наверное, ты прав.   -  person cookavich    schedule 08.04.2016


Ответы (1)


Хорошо, кажется, я решил свою проблему, не совсем понимая, почему.

if ($sort == 'last_calibration_date')
{
     $query->select('meters.*');
     $query->join('calibrations as calibration', 'calibration.meter_id', '=', 'meters.id');
     $sort = 'calibration.calibration_date';
}

Добавление того, что $query->select('meters.*'); решило это. Опять же, не уверен, почему. Насколько я понимаю, это выбор столбцов конкретной таблицы, а не отношений модели.

Во всяком случае, это работает сейчас.

person cookavich    schedule 08.04.2016