웅변 모델 간의 중첩 된 관계로 평균을 계산하고 싶습니다. 예를 들어 programs
, activities
및 statistics
이라는 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 |
-----------------------------------
,
이제 의 program
과 type
의 평균은 statistic
입니다. 나는 모델의 관계를 정의하고, 코드를 다음 시도했지만 아무 소용이 :
$program = Program::find(1);
$avg = $program->activities->where('statistics.type', 'A')->avg('statistics.value');
$ 평균 항상 0 또는 null도 where
절없이 프로그램에는 활동이없는 경우.
$program->activities
이 활동 집합을 반환하고 $activity-> statistics
이 통계 집합을 반환하기 때문에 관계를 올바르게 정의했다고 확신합니다.
아이디어가 있으십니까?
아, 작동하는 것처럼 보입니다.하지만 실제 코드가 뷰에서 전체 프로그램 루프 이후로, 나는 어딘가에 놓을 필요가 있다고 생각합니다. 그래서 나는 블레이드라고 부를 수 있습니다. 어떤 아이디어입니까? 아, 또한 전체 프로그램 평균을 구할 수 있습니까? (즉, 프로그램 ID를 지정하지 않아도되지만'type'을 지정해야 함을 의미합니다) – tronic
@tonic 컨트롤러에 넣을 수는 있지만 로직을 모델에 넣고 컨트롤러에서 실행하여 데이터를 전달하는 것이 훨씬 낫습니다. 관점. 데이터 관련 로직을 뷰에 유지하는 것은 끔찍한 생각입니다. 모든 프로그램의 평균을 찾고 싶다면 간단한'Statistics :: where ('type', 'A') -> avg ('score')'가 효과가 없을까요? 어떤 통계가 프로그램을 가질 수없고 어떤 활동에만 속한 통계를 얻고 싶다면'has()'를 사용하십시오 :'Statistics :: has ('activity') -> where ('type', 'A') -> avg ('score')' –
아, 두 번째 질문에 신경 쓰지 마라. 나는 단지'statistics'에 곧바로 where 절을 직접 사용할 수있다. 어리석은 나 하하. – tronic