Я работаю с данными, которые я выводил из разных отношений.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
?
Обновление до 5.2, вы находитесь в прошлом! –
По-прежнему будут те же проблемы. – cookavich
TBH с использованием DB :: raw для этого будет меньше головной боли для вас. –