2014-09-06 16 views
10

Ho un modello chiamato School e ha molti Studenti.Laravel Eloquent: come ordinare i risultati dei modelli correlati?

Ecco il codice nel mio modello:

public function students() 
{ 
    return $this->hasMany('Student'); 
} 

sto ottenendo tutti gli studenti con questo codice in mio controller:

$school = School::find($schoolId); 

e nella vista:

@foreach ($school->students as $student) 

Ora desidero ordinare gli studenti da parte di alcuni campi nello students tabella. Come lo posso fare?

+0

@JaredFarrish orderBy ci sarebbe influenzare query nella tabella 'schools', non 'studenti', e ovviamente genererebbe un errore, a meno che non si unisca ai tavoli. –

risposta

26

Hai alcuni modi per raggiungere tale obiettivo:

// when eager loading 
$school = School::with(['students' => function ($q) { 
    $q->orderBy('whateverField', 'asc/desc'); 
}])->find($schoolId); 

// when lazy loading 
$school = School::find($schoolId); 
$school->load(['students' => function ($q) { 
    $q->orderBy('whateverField', 'asc/desc'); 
}]); 

// or on the collection 
$school = School::find($schoolId); 
// asc 
$school->students->sortBy('whateverProperty'); 
// desc 
$school->students->sortByDesc('whateverProperty'); 


// or querying students directly 
$students = Student::whereHas('school', function ($q) use ($schoolId) { 
    $q->where('id', $schoolId); 
})->orderBy('whateverField')->get(); 
+0

Come ordinare le raccolte in base a più proprietà del modello? Ad esempio, voglio ordinare per classe e poi per nome. '$ school-> students-> sortBy ('whateverProperty') -> sortBy ('anotherProperty');' non funziona. Ordina solo la collezione di 'anotherProperty'. – Debiprasad

+0

Ecco una soluzione che funziona. Usa la chiusura. http://stackoverflow.com/a/25451441/225790 – Debiprasad

+0

Sì, la soluzione collegata di Mark Baker è accurata. Un'altra soluzione sarebbe 'usort'. –

3

Per rispondere alla domanda iniziale, la proprietà dinamica students può accedere anche come metodo di relazione.

Così avete questo per andare a prendere tutti gli studenti:

$students = $school->students; 

Ora, come un metodo di rapporto, questo è equivalente:

$students = $school->students()->get(); 

Detto questo, ora è possibile aggiungere in un certo ordine:

$students = $school->students()->orderBy('students.last_name')->get(); 

Poiché eloquente eseguirà un join, assicurati di includere il nome della tabella quando si fa riferimento la colonna da ordinare per.

È inoltre possibile aggiungere questo al metodo students se si desidera impostare un ordine predefinito che restituirà sempre $school->students. Controlla la documentazione per hasMany() per vedere come funziona.

0

è possibile aggiungere orderBy al vostro rapporto, quindi l'unica cosa che devi cambiare è

public function students() 
{ 
    return $this->hasMany('Student'); 
} 

a

public function students() 
{ 
    return $this->hasMany('Student')->orderBy('id', 'desc') 
} 
Problemi correlati