[php] Laravel Eloquent의 “With ()”함수를 사용하여 특정 열 가져 오기

나는 두 개의 테이블을 가지고 UserPost. 하나 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();

그것은 단지 선택합니다 idusername다른 테이블에서. 이것이 다른 사람들을 도울 수 있기를 바랍니다.


실제로 필요한 결과를 검색 하려면 기본 쿼리 (이 경우 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();