2017-02-23 13 views
1

Laravel에서 열심히 또는 게으른 관계를로드 할 수 있음을 알고 있습니다. 또한 관계 객체가 변장 기본적으로 쿼리 객체가 있음을 알고, $user->load('teams')를 호출하면 해당 쿼리를 실행하고 $ 사용자 개체에 추가하는 (내가 아는 방법을 정확하게하지 않는 경우에도 마찬가지입니다.)Laravel에서 속성을 eager/lazy 로딩 할 수 있습니까?

가 나는 User을 말해봐 누가 코멘트에서 포인트를 얻었습니다. 나는 한 번에 모두로드하고 싶었다면 내가이 쿼리를 실행하는 것,

SELECT `user_id`, sum(`points`) AS `total_points` FROM `user_comments` where `id` = ? 

:

SELECT `users`.*, sum(`user_comments`.`points`) AS `total_points` 
FROM `users` LEFT JOIN `user_points` ON `users`.`id` = `user_comments`.`user_id` 
GROUP BY `users`.`id` 

내가 원하는에를 데이터베이스 호출에 사용자의 포인트를 획득하기 위해, 나는 이런 식으로 뭔가를 실행할 것 이러한 작업을 수행하려면 Laravel을 사용하십시오. 나는이

User::where('age', '>', 40)->with('total_points')->get(); 

같은 것을 작성하는 같은 과 동시에 사용자와 총 점수를로드하기 위해이

$user->total_points 

같은 값에 액세스합니다. 나는 많은 레코드가있을 것이며 항상 사용자가있을 때마다 DB join 쿼리를 호출하고 싶지 않습니다. 또한 전체 점수 값만 필요하면 각 사용자마다 모든 주석을로드하지 않는 것이 좋습니다.

Laravel에서이를 수행하기 위해 관계 작성기를 사용할 수있는 방법이 있습니까?

답변

4

public function total_points() { 
     return $this->hasOne('user_comments') 
      ->selectRaw('sum(points) as points, user_id') 
      ->groupBy('user_id'); 
    } 

아래처럼 사용자 모델에서 하나 개의 관계를 확인 그런 다음 컨트롤러

이 작동
$user = User::where('age', '>', 40)->with('total_points')->get(); 
+0

에서이 작업을 수행! 일단 내가 그 작업을 얻었다면, $ appends 속성을 추가하여 관계가로드되고 값을 획득했는지 확인합니다. – whiterook6

+0

하지만 속성 일 경우 가능하지 않습니다! 이걸 위해 내가해야 할 일은 무엇입니까? – shmoolki