2017-05-18 1 views
1

웅변 모델 간의 중첩 된 관계로 평균을 계산하고 싶습니다. 예를 들어 programs, activitiesstatistics이라는 3 개의 테이블이 있습니다. 다음과 같이중첩 된 웅변 관계에서 평균을 얻으십시오.

단순 위해서

, 나는 구조를 최소화하기 위해 노력할 것입니다 :

program 표 :

------------- 
| id | name | 
------------- 
| 1 | Foo | 
| 2 | Bar | 
------------- 

activities 테이블 :

----------------------------------- 
| id | program_id | name   | 
----------------------------------- 
| 1 | 1   | Foo 1   | 
| 2 | 1   | Foo 2   | 
| 3 | 1   | Foo 3   | 
| 4 | 2   | Bar 1   | 
| 5 | 2   | Bar 2   | 
----------------------------------- 

statistics 테이블 :

----------------------------------- 
| id | activity_id | type | score | 
----------------------------------- 
| 1 | 1   | A | 25 | 
| 2 | 1   | B | 20 | 
| 3 | 1   | A | 22 | 
| 4 | 2   | A | 27 | 
| 5 | 2   | B | 24 | 
| 6 | 3   | A | 23 | 
----------------------------------- 
,

이제 의 programtype의 평균은 statistic입니다. 나는 모델의 관계를 정의하고, 코드를 다음 시도했지만 아무 소용이 :

$program = Program::find(1); 
$avg  = $program->activities->where('statistics.type', 'A')->avg('statistics.value'); 

$ 평균 항상 0 또는 null도 where 절없이 프로그램에는 활동이없는 경우.

$program->activities이 활동 집합을 반환하고 $activity-> statistics이 통계 집합을 반환하기 때문에 관계를 올바르게 정의했다고 확신합니다.

아이디어가 있으십니까?

답변

2

이 같은 whereHas()를 사용할 수 있습니다

Statistics::whereHas('activity', function ($q) use($programId) { 
     $q->where('program_id', $programId); 
    }) 
    ->where('type', 'A') 
    ->avg('score'); 

당신이 "() 활동 통계 belongsTo를"해야 activity 관계를 정의했는지 확인하십시오.

+0

아, 작동하는 것처럼 보입니다.하지만 실제 코드가 뷰에서 전체 프로그램 루프 이후로, 나는 어딘가에 놓을 필요가 있다고 생각합니다. 그래서 나는 블레이드라고 부를 수 있습니다. 어떤 아이디어입니까? 아, 또한 전체 프로그램 평균을 구할 수 있습니까? (즉, 프로그램 ID를 지정하지 않아도되지만'type'을 지정해야 함을 의미합니다) – tronic

+0

@tonic 컨트롤러에 넣을 수는 있지만 로직을 모델에 넣고 컨트롤러에서 실행하여 데이터를 전달하는 것이 훨씬 낫습니다. 관점. 데이터 관련 로직을 뷰에 유지하는 것은 끔찍한 생각입니다. 모든 프로그램의 평균을 찾고 싶다면 간단한'Statistics :: where ('type', 'A') -> avg ('score')'가 효과가 없을까요? 어떤 통계가 프로그램을 가질 수없고 어떤 활동에만 속한 통계를 얻고 싶다면'has()'를 사용하십시오 :'Statistics :: has ('activity') -> where ('type', 'A') -> avg ('score')' –

+0

아, 두 번째 질문에 신경 쓰지 마라. 나는 단지'statistics'에 곧바로 where 절을 직접 사용할 수있다. 어리석은 나 하하. – tronic