2016-12-06 3 views
1

У меня есть две родственные модели 'Yards' & 'Inspections'. Двор может иметь несколько проверок.Данные заказа Laravel по соотношению property

Я хочу, чтобы иметь возможность заказать список дворов на основе свойства инспекции 'reinspect_at'. У меня есть метод модели, который возвращает последнюю инспекцию для двора в зависимости от даты проверки.

Я попытался следующие:

$yards = Yard::orderBy('quarantined', 'DESC') 
     ->with(['latestInspection' => function($query){ 
      $query->orderBy('reinspect_at', 'asc'); 
     }]) 
     ->get(); 

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

Я хочу, чтобы иметь возможность всегда возвращать последнюю инспекцию для двора, но нужно иметь возможность переупорядочить список дворов на основе даты reinspect_at для последней проверки для каждого двора. Cheers

Снимок экрана из списка ярдов внизу. Как вы можете видеть, дата проверки - это то, как я хочу иметь возможность заказать результат.

enter image description here

** Обновление ** Похоже, что я хочу, это возможно в шаблоне во внешнем интерфейсе с помощью:

@foreach($yards->sortBy('latestInspection.reinspect_at') as $yard) 

Было бы предпочтительнее, чтобы сделать быть в состоянии сделать это из контроллера, хотя , поэтому у меня могут быть другие варианты для заказа.

+0

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

+0

добавили скриншот – Pedro

ответ

0

Например:

function latestInspection() { 
    return $this->hasOne('App\Yard')->orderBy('reinspect_at', 'asc'); 
} 

И

$yards = Yard::with('latestInspection')->orderBy('quarantined', 'DESC')->get(); 
+0

Привет, этот путь только заказывает инспекцию для каждого двора, я хочу заказать список дворов на основе даты reinspect_at от последней проверки. i.e yard 1 - 01-01-2016 yard 2 - 02-01-2016 – Pedro

0

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

$yards = Yard::with(['inspections'])->get()->sortBy(function($yard) { 
    return $yard->inspections->max('reinspect_at'); 
}); 

Я удалил ваш заказ путем карантина. Не уверен, как вы хотите справиться с этим, если вы также сортируете по reinspect_date.

+0

Привет благодарность за ответ, это, похоже, не имеет значения для заказа списка ярдов. – Pedro

0

Похоже, что я могу сделать следующее:

$yards = Yard::orderBy('quarantined', 'DESC') 
     ->orderBy('archived', 'ASC') 
     ->orderBy('name', 'ASC') 
     ->get(); 
$yards = $yards->sortByDesc('latestInspection.reinspect_at'); 
+0

Так это работает так! – lewis4u

+0

Да, эта строка: '$ yards = $ yards-> sortByDesc ('latestInspection.reinspect_at');' Сортирует его на основе даты отношения – Pedro

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