2017-02-22 6 views
0

У меня есть следующие 2 таблицы:Laravel Eloquent заказ с использованием данных Relation

Cars 
---- 
id | created_at 

and 

Repaired 
id | cars_id | updated_at 

Я хочу, чтобы отобразить все автомобили, заказанные created_at по алфавиту, но и по заказу updated_at из таблицы Repaired поворота. Отремонтированный может иметь много записей конкретных cars_id.

Так что если carA является created_at 2017-02-20 и carB является created_at 2016-01-10, но updated_at в Капремонт для carB на 2017-02-22, я хочу, чтобы отобразить carB ПЕРЕД carA, потому что отношение «новее».

Я также не хочу загружать данные из таблицы отношений.

Я попытался follwing:

$cars = $model->load(['repaired' => function($query) { 
    return $query->orderBy('updated_at', 'desc'); 
}])->orderBy('created_at', 'desc'); 

и

$model->join('repaired', 'repaired.cars_id', '=', 'cars.id') 
     ->orderBy('repaired.updated_at', 'desc') 
     ->orderBy('cars.created_at', 'desc') 
     ->select('cars.*'); 

^этот запрос возвращает все элементы из таблицы После ремонта, даже если updated_at поле NULL. И я не могу их сгруппировать.

+0

Вы что-то пробовали? – Sebastian

ответ

1

Вы можете использовать функцию touch parent timestamps в Eloquent, чтобы обновить updated_at для автомобиля, каждый раз, когда исправляется ремонт.

В вашей Repaired модели просто добавьте эту строку:

protected $touches = ['car']; 

Это предполагает, что ваш метод отношение называется car() конечно.

Тогда вы можете сделать это:

Cars::orderBy('updated_at'); 

Каждый раз, когда строка в таблице Repaired добавлены или обновлены, автомобиль, указанный в car отношении будет иметь свой updated_at набор в то же время. Таким образом, вы можете заказать его.

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