with()
메서드와 load()
메서드의 차이를 실제로 이해하려고 시도했지만 실제로 이해할 수 없었습니다.laravel with load() 메서드
내가 본 것처럼, with()
메서드를 사용하면 관계를 열망하기 때문에 "더 좋음"입니다. load()
을 사용하면 마치 hasMany()
(또는 객체 간의 관계와 관련된 다른 방법)을 사용하는 것처럼 관계를로드합니다.
잘못 받아 들여지지 않습니까?
with()
메서드와 load()
메서드의 차이를 실제로 이해하려고 시도했지만 실제로 이해할 수 없었습니다.laravel with load() 메서드
내가 본 것처럼, with()
메서드를 사용하면 관계를 열망하기 때문에 "더 좋음"입니다. load()
을 사용하면 마치 hasMany()
(또는 객체 간의 관계와 관련된 다른 방법)을 사용하는 것처럼 관계를로드합니다.
잘못 받아 들여지지 않습니까?
둘 다 첫 번째에 관련된 모델을로드하는 동일한 결과를 얻습니다. 사실 두 쿼리는 정확히 같은 두 쿼리를 실행합니다. 가장 큰 차이점은 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()
으로 끝났는지 상관없이 쿼리 만 실행합니다.
고마워요! 나는 여전히 질문을 가지고 있는데 왜 열망하는 로딩을 사용하지 않고 정상적인'hasMany()'메소드를 사용하지 않을 것인가? (나는 내 대답을위한 해결책은 내가 한 명의 사용자 만 다루고있을 때마다 2 개의 쿼리를 실행하기 때문에 열망하는로드를 사용하는지 여부를 상관하지 않는다는 것입니다.) – kfirba
당신이 보낸 데이터. 관련된 모델 - 주석 (이 예제에서)에만 관심이 있다면'hasMany()'관계 메소드를 조회하면됩니다 :'$ users = User :: find (1) -> comments;'는 정보 만 반환합니다 의견이 아니라 사용자가 그러나 초기 모델 (사용자)에서 데이터에 액세스해야한다면'$ user = User :: where ('id', '1') -> with ('comments') -> get(); '는 User 테이블의 데이터와 * 관련 주석을 포함하는 모음을 제공합니다. 두 경우 모두 동일한 쿼리가 실행되지만 결과 집합은 다릅니다. – damiani
'와 같이 '중첩 될 수 있습니까? 좋아요 - https://stackoverflow.com/questions/47048804/get-related-data-through-relation – Blagoh