2016-04-04 1 views
1

Я работаю с данными, которые я выводил из разных отношений.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?

+0

Обновление до 5.2, вы находитесь в прошлом! –

+0

По-прежнему будут те же проблемы. – cookavich

+0

TBH с использованием DB :: raw для этого будет меньше головной боли для вас. –

ответ

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.*'); решило его. Опять же, не знаю, почему. Я понимаю, что это выбор столбцов конкретной таблицы, а не отношения модели.

В любом случае, сейчас он работает.

 Смежные вопросы

  • Нет связанных вопросов^_^