2014-09-06 5 views
10

이라는 모델이 있으며 학생이 많습니다.입니다.Laravel Eloquent : 관련 모델의 결과를 주문하는 방법?

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

내 컨트롤러에서이 코드를 모든 학생을 얻고있다 :

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

및 뷰에서 :

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

내 모델에서 코드입니다

이제 학생을의 일부 필드로 주문하고 싶습니다.테이블. 어떻게해야합니까?

+0

@JaredFarrish 해 orderBy의'schools' 테이블에 쿼리를 거기에 영향을 줄 'students'라고하며, 테이블에 가입하지 않으면 분명히 오류가 발생합니다. –

답변

26

이를 달성하는 몇 가지 방법이 있습니다

// 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

모델의 여러 속성을 사용하여 컬렉션을 정렬하는 방법은 무엇입니까? 예를 들어, 클래스별로 정렬 한 다음 이름별로 정렬하려고합니다. '$ school-> students-> sortBy ('whateverProperty') -> sortBy ('anotherProperty');는 작동하지 않습니다. 'anotherProperty'에 의해서만 컬렉션을 정렬합니다. – Debiprasad

+0

다음은 작동하는 해결책입니다. 그것은 클로저를 사용합니다. http://stackoverflow.com/a/25451441/225790 – Debiprasad

+0

예, Mark Baker의 링크 된 솔루션은 깔끔합니다. 또 다른 해결책은 'usort'입니다. –

3

원래의 질문에 대답하기 위해, students 동적 속성이 아니라 관계의 방법으로 액세스 할 수 있습니다. 그래서

모든 학생들 가져올이 있습니다

$students = $school->students; 

것은 이제 관계 방법으로,이 동일합니다 :

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

이를 감안할 때, 당신은 지금 어떤 순서에 추가 할 수 있습니다

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

웅변이 참여를 수행 할 것이므로 참조 할 때 테이블 이름을 포함해야합니다 주문할 열을 보내십시오.

$school->students이 항상 반환하는 기본 순서를 설정하려는 경우 students 방법에이를 추가 할 수도 있습니다. 이 작동 방식을 보려면 hasMany()에 대한 설명서를 확인하십시오.

0

당신이 당신의 관계에 해 orderBy을 추가 할 수 있습니다, 그래서 당신은 변경해야 할 유일한 것은이

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

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