2014-09-23 3 views
14

with() 메서드와 load() 메서드의 차이를 실제로 이해하려고 시도했지만 실제로 이해할 수 없었습니다.laravel with load() 메서드

내가 본 것처럼, with() 메서드를 사용하면 관계를 열망하기 때문에 "더 좋음"입니다. load()을 사용하면 마치 hasMany() (또는 객체 간의 관계와 관련된 다른 방법)을 사용하는 것처럼 관계를로드합니다.

잘못 받아 들여지지 않습니까?

답변

32

둘 다 첫 번째에 관련된 모델을로드하는 동일한 결과를 얻습니다. 사실 두 쿼리는 정확히 같은 두 쿼리를 실행합니다. 가장 큰 차이점은 with() eager가 초기 쿼리 (예 : all(), first() 또는 find(x)) 직후 관련 모델을 앞에로드한다는 점입니다. load()을 사용할 때 먼저 초기 쿼리를 실행 한 다음 나중에 관계에 열심히로드하십시오.

"열망은"여기 우리가 특정 결과에 대한 모든 관련 모델을 연결하고 있다는 의미는 N 항목의 수는 단지 하나 개의 쿼리, N 쿼리를 실행하는 데에 반대를 사용하여 설정 초기 세트에서.


우리 열망로드 예를 들어, with()를 사용하는 경우 with()

를 사용 열망로드 :

$users = User::with('comments')->get(); 

을 ... 우리는 5 사용자가있는 경우, 다음 두 쿼리는 즉시 실행하세요 :

select * from `users` 
select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5) 

... 그리고 우리는 사용자 모델에 주석이 첨부 된 모델 모음으로 끝나기 때문에 $users->comments->first()->body과 같은 것을 할 수 있습니다.


"게으른"열망 사용하여로드 load()

또는, 우리가 처음 초기 결과를 얻어서, 두 개의 쿼리를 분리 할 수 ​​있습니다 :

$users = User::all(); 

실행 :

select * from `users` 

그리고 나중에 우리는 모든 사용자에 대한 관련 설명이 필요, 우리는 사후을 열망로드 할 수

select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5) 

... 그리고 우리는 같은 결과로 끝날 : 2 쿼리를 실행

$users = $users->load('comments'); 

, 그냥 두 단계로 나뉩니다. 다시 말하지만 으로 전화하여 모든 항목에 대한 관련 모델을 얻을 수 있습니다.


load()with()를 사용할 수 있습니까? load()은 몇 가지 동적 조건에 따라 나중에 두 번째 쿼리를 실행해야하는지 여부를 결정할 수있는 옵션을 제공합니다. 그러나 모든 관련 항목에 액세스해야한다는 의문의 여지가없는 경우 with()을 사용하십시오. (워드 프로세서는 또한 부하()를 사용하여 캐싱 혜택을 참조하지만, 나는 잘 알고 아니에요, 사실, 내가 load()의 결과를 캐시하지 않습니다 생각합니다.)


대안을 다음 중 하나에 초기 결과 집합을 반복하고 각 항목에 대해 hasMany() 관계를 쿼리합니다. 그러면이 예제에서는 n + 1 쿼리 또는 을 실행하게됩니다. 열의 부하는 with() 이상으로 끝나거나 load()으로 끝났는지 상관없이 쿼리 만 실행합니다.

+0

고마워요! 나는 여전히 질문을 가지고 있는데 왜 열망하는 로딩을 사용하지 않고 정상적인'hasMany()'메소드를 사용하지 않을 것인가? (나는 내 ​​대답을위한 해결책은 내가 한 명의 사용자 만 다루고있을 때마다 2 개의 쿼리를 실행하기 때문에 열망하는로드를 사용하는지 여부를 상관하지 않는다는 것입니다.) – kfirba

+1

당신이 보낸 데이터. 관련된 모델 - 주석 (이 예제에서)에만 관심이 있다면'hasMany()'관계 메소드를 조회하면됩니다 :'$ users = User :: find (1) -> comments;'는 정보 만 반환합니다 의견이 아니라 사용자가 그러나 초기 모델 (사용자)에서 데이터에 액세스해야한다면'$ user = User :: where ('id', '1') -> with ('comments') -> get(); '는 User 테이블의 데이터와 * 관련 주석을 포함하는 모음을 제공합니다. 두 경우 모두 동일한 쿼리가 실행되지만 결과 집합은 다릅니다. – damiani

+0

'와 같이 '중첩 될 수 있습니까? 좋아요 - https://stackoverflow.com/questions/47048804/get-related-data-through-relation – Blagoh