나는 두 개의 테이블을 가지고 User
와 Post
. 하나 User
는 많은 것을 가질 수 posts
있고 하나 post
는 하나 에 만 속합니다 user
.
내 User
모델에는 hasMany
관계가 있습니다 …
public function post(){
return $this->hasmany('post');
}
그리고 내 post
모델에는 belongsTo
관계가 있습니다 …
public function user(){
return $this->belongsTo('user');
}
이제이 두 테이블을 사용하여 조인하고 싶지만 두 Eloquent with()
번째 테이블의 특정 열을 원합니다. Query Builder를 사용할 수 있지만 원하지는 않습니다.
경우에 Post
모델 I 쓰기 …
public function getAllPosts() {
return Post::with('user')->get();
}
다음 쿼리를 실행합니다 …
select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)
하지만 내가 원하는 것은 …
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
내가 사용할 때 …
Post::with('user')->get(array('columns'....));
첫 번째 테이블의 열만 반환합니다. with()
두 번째 테이블에서 특정 열을 사용하고 싶습니다 . 어떻게해야합니까?
답변
글쎄, 나는 해결책을 찾았다. 그것은 배열의 두 번째 인덱스로 closure
함수를 전달하여 수행 할 수 있습니다with()
Post::with(array('user'=>function($query){
$query->select('id','username');
}))->get();
그것은 단지 선택합니다 id
및 username
다른 테이블에서. 이것이 다른 사람들을 도울 수 있기를 바랍니다.
실제로 필요한 결과를 검색 하려면 기본 쿼리 (이 경우 ID)가 $ query-> select () 의 첫 번째 매개 변수 여야합니다 . *
답변
라 라벨 5.5부터 다음과 같이 할 수 있습니다 :
Post::with('user:id,username')->get();
id
현장 관리 및 문서에foreign keys
명시된대로 :
이 기능을 사용하는 경우 항상 검색하려는 열 목록에 id 열과 관련 외래 키 열을 포함시켜야합니다.
예를 들어, 사용자가 팀에 속 team_id
하고 외래 키 열인 $post->user->team
경우 지정하지 않으면 비어 있습니다. team_id
Post::with('user:id,username,team_id')->get();
답변
당신의에서 Post
모델
public function user()
{
return $this->belongsTo('User')->select(array('id', 'username'));
}
원래 크레딧은 Laravel Eager 로딩으로 이동-특정 열만로드
답변
다른 방향으로 갈 때 (hasMany) :
User::with(array('post'=>function($query){
$query->select('id','user_id');
}))->get();
관계를 해결하기 위해 외래 키 (이 예제에서는 user_id라고 가정)를 포함해야합니다. 그렇지 않으면 관계에 대한 결과가 0이됩니다.
답변
Laravel 5.7에서는 다음과 같은 특정 필드를 호출 할 수 있습니다
$users = App\Book::with('author:id,name')->get();
foreign_key
선택 에 필드 를 추가하는 것이 중요합니다 .
답변
당신의에서 Post
모델 :
public function userWithName()
{
return $this->belongsTo('User')->select(array('id', 'first_name', 'last_name'));
}
이제 사용할 수 있습니다 $post->userWithName
답변
당신은 사용하여 특정 열을 얻고 싶은 경우에 with()
원래 그의 대답에 @ 아담 응답하는 다음과 같이 다음 코드를 사용할 수 있습니다 laravel의 웅변에 여기에 이 같은 질문의 응답 :
Post::with('user:id,username')->get();
그래서 나는 그것을 내 코드에서 사용 했지만 오류가 발생했다 1052: Column 'id' in field list is ambiguous
. 그래서 너희들도 같은 문제에 직면한다면
그런 다음 해결 하려면 with()
아래 코드와 같이 메소드 의 id 열 앞에 테이블 이름을 지정해야합니다 .
Post::with('user:user.id,username')->get();