2015-04-18 9 views
5

Mam kwerendy w moim kontrolera:Yii2 ORDER BY dla relacyjnych danych w ActiveRecord

$model = Object::find()->where(['id' => $id])->with(['backups'])->one(); 

getBackups jest hasMany() relacja, więc $ modelu zwraca kilka 'kopie zapasowe'.

Czy istnieje sposób na zamówienie "kopii zapasowych"?

Próbowałem następujących bez rezultatów (lub błędy):

$model = Object::find() 
      ->where(['id' => $id]) 
      ->with(['backups' => function($query) { 
       $query->orderBy(['updated_at' => SORT_DESC]); 
      }]) 
      ->one(); 
+0

Testowałem twój kod i działa dobrze (drugi z zapytaniem o zamówienie zwrotne). Przetestuj go zmieniając kierunek zamówienia (SORT_DESC, SORT_ASC): echo $ model-> backups [0] -> id. Id powinien się zmienić. w przeciwnym razie sądziłbym, że w bazie danych jest tylko jedna kopia zapasowa. –

+0

Będę miał inne spojrzenie na to. Dzięki –

+0

Mam 3 pola relacyjne pokazujące wpis, który teraz oglądam. Próbowałem obu opcji sortowania i jestem echo id identyfikatora kopii zapasowych [0], jak mówisz. Nie mogę uzyskać żadnych zmieniających się wyników:/ –

Odpowiedz

7

Można w Object modelu deklarują posortowanych relacja backups z orderBy:

public function getSortedBackups() 
    { 

    return $this->hasMany(Backup::className(), ['object_id' => 'id'])->orderBy(['backups.updated_at'=>SORT_DESC]); 
    } 

koniec, gdy wyjściowe te kopie zapasowe:

foreach($model->sortedBackups as $backup){ 
... 
} 
+0

to działa. +1. –