Laravel Eloquent : 조인 된 테이블에서 특정 열만 가져 오는 방법


102

Eloquent에는 테마와 사용자라는 2 개의 조인 된 테이블이 있습니다.

테마 모델 :

public function user() {
  return $this->belongs_to('User');
}

사용자 모델 :

public function themes() {
  return $this->has_many('Theme');
}

내 Eloquent API 호출은 다음과 같습니다.

return Response::eloquent(Theme::with('user')->get());

테마의 모든 열 (괜찮음)과 사용자의 모든 열 (괜찮지 않음)을 반환합니다. 사용자 모델의 '사용자 이름'열만 필요합니다. 쿼리를 어떻게 제한 할 수 있습니까?


비슷한 작업을 Response하고 있는데 어떤 클래스를 가져와야하는지 알 수 있습니까?
Agnes Palit

답변:


103

모델을 변경하여 선택하려는 열을 지정하십시오.

public function user() {
  return $this->belongs_to('User')->select(array('id', 'username'));
}

그리고 여러분이 참여하고있는 칼럼을 포함하는 것을 잊지 마십시오.


6
훌륭한 답변, 조인 열을 포함하는 것에 대한 팁으로 많은 시간을 절약했습니다!
greatwitenorth

어떤 곳에서 ID와 사용자 이름이 아닌 ID 만 필요하면 어떻게하나요? 둘 다 선택해야합니까?
Darius.V

안녕하세요 모델 쿼리 빌더에서 선택 기능이 동일한 기능을 가지고 있습니까?
Gokigooooks 2015 년

4
나는 그것이 좋은 접근이라고 생각하지 않는다. 열 이름을 하드 코딩하는 것과 같습니다. 모든 장소는이 열만 반환합니다. 다른 API에서는 열이 더 필요할 수 있으므로 여기서는 작동하지 않습니다. 여기에서는 QueryBuilder를 사용하는 것이 옵션이라고 생각합니다.
Aman Sura

2
이는 통화를 진행할 때마다 발생하므로 극적인 접근 방식입니다. 나는 사자 드 라프의 대답은 하나 대부분의 사람들이 관심이있을 것입니다 생각합니다.
MMMTroy

37

Laravel> = 5.2의 경우

사용 > 뽑은 () - 방법

$roles = DB::table('roles')->pluck('title');

단일 열의 값을 포함하는 배열을 검색하려면 pluck 메소드를 사용할 수 있습니다.


Laravel <= 5.1의 경우

사용 -> 목록 () 방법

$roles = DB::table('roles')->lists('title');

이 메서드는 역할 제목 배열을 반환합니다. 반환 된 배열에 대해 사용자 지정 키 열을 지정할 수도 있습니다.


2
이것은 실제로 조인 / 관계에 관한 질문에 대한 답변이 아닙니다.
orrd

30

다음과 같이 get 매개 변수에 필드 배열을 제공 할 수 있습니다.

return Response::eloquent(Theme::with('user')->get(array('user.username'));

UPDATE (for Laravel 5.2) 문서 에서 다음을 수행 할 수 있습니다.

$response = DB::table('themes')
    ->select('themes.*', 'users.username')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get();

2
나는 이것을 시도했는데 오류가 표시 SQLSTATE[42S22]: Column not found되고 SQL에 with. 오류에 나타나는 SQL은 "SELECT fk_table.column1 FROM main_table"입니다.
Michel Ayres 2015

1
"users.username"( "user.username"아님)입니다. 실제 데이터베이스와 일치하는 테이블 및 열 이름이 있으면 대답의 코드가 작동합니다. 이 솔루션의 단점은 Eloquent를 사용하는 대신 SQL 쿼리를 작성하는 것이므로 이름이 실제 데이터베이스 테이블 및 열과 일치해야합니다.
orrd

22

알아요, 당신은 Eloquent를 요청하지만 Fluent Query Builder로 할 수 있습니다

$data = DB::table('themes')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get(array('themes.*', 'users.username'));

16

이것이 내가하는 방법

$posts = Post::with(['category' => function($query){
        $query->select('id', 'name');
      }])->get();

user2317976의 첫 번째 답변이 나를 위해 작동하지 않았으며 laravel 5.1을 사용하고 있습니다.


2
최신 답변 = 유용합니다!
thesunneversets

감사. 그것은 나를 위해 잘 작동합니다. 'id'로했던 것처럼 select 문에 외래 키를 추가해야합니다. 그렇지 않으면 null을 반환합니다.
Iman Sedighi

그러나 이것은 여전히 ​​ID (post_id 및 category_id)를 모두 포함하는 각 결과에 대해 "pivot"필드를 검색합니다. 맞습니까? 어떻게 탈 수 있습니까?
mayid

1
@mayid 당신은 추가 시도 할 수 있습니다 pivot포스트 모델 $ 숨겨진 배열에protected $hidden = ['pivot']
사자 드 라프에게

이것이 최상의 솔루션입니다 (라 라벨의 최신 버전을 사용한다고 가정)
orrd

11

또 다른 옵션은 $hidden모델 의 속성을 사용 하여 표시하지 않을 열을 숨기는 것입니다. 이 속성을 즉시 정의하거나 모델에 기본값을 설정할 수 있습니다.

public static $hidden = array('password');

이제 JSON 응답을 반환 할 때 사용자 비밀번호가 숨겨집니다.

비슷한 방식으로 즉석에서 설정할 수도 있습니다.

User::$hidden = array('password');

2
Laravel 4.2에서 동적으로 설정하려고 할 때 '보호 된 속성 User :: $ hidden에 액세스 할 수 없습니다'라는 메시지가 나타납니다.
mtmacdonald

1
아니어야합니다 static.
StackOverflowed

@StackOverflowed, 나는 당신이하고 Laravel 3에 관련된 것으로이 질문 / 대답은 얼마나 오래된의 통지를하지 않았다 가져
제이슨 루이스

10

페이지 매김과 함께 사용

$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);

6

user2317976은 관련 테이블의 열을 선택하는 훌륭한 정적 방법을 도입했습니다.

모델을 사용할 때 원하는 것을 얻을 수 있도록 내가 찾은 동적 트릭은 다음과 같습니다.

return Response::eloquent(Theme::with(array('user' => function ($q) {
    $q->addSelect(array('id','username'))
}))->get();

이 트릭은 load ()에서도 잘 작동한다는 것을 알았습니다. 이것은 매우 편리합니다.

$queriedTheme->load(array('user'=>function($q){$q->addSelect(..)});

대상 테이블의 키도 포함해야합니다. 그렇지 않으면 찾을 수 없습니다.


6

이 방법:

Post::with(array('user'=>function($query){
    $query->select('id','username');
}))->get();

항상 귀하의 답변을 설명해주십시오.
Rohit Gupta 2016 년

비슷한 문제가 있었는데 이것이 지금까지 가장 현명한 방법입니다! 이 대답은 과소 평가되었습니다!
eldblz

이것은 Sajjad Ashraf가 이전에 제출 한 답변과 동일합니다.
orrd

5

이것은 오래된 질문이라는 것을 알고 있지만 질문 작성자가하는 것처럼 API를 빌드하는 경우 출력 변환기를 사용하여 이러한 작업을 수행하십시오.

Transofrmer는 실제 데이터베이스 쿼리 결과와 컨트롤러 사이의 계층입니다. 사용자 또는 API 소비자에게 출력 될 내용을 쉽게 제어하고 수정할 수 있습니다.

출력 변환 레이어의 견고한 기반으로 Fractal 을 권장 합니다. 여기 에서 설명서를 읽을 수 있습니다 .



4

Laravel 5.5에서이를 수행하는 가장 깨끗한 방법은 다음과 같습니다.

Theme::with('user:userid,name,address')->get()

콜론과 선택하려는 필드를 쉼표로 구분하고 그 사이에 공백없이 추가합니다.


페이지 매김을 사용할 때 관련 테이블의 특정 열을 어떻게 가져올 수 있는지 알고 있습니까?
Daniyal Nasir 19

2

모델 사용 :

Model::where('column','value')->get(['column1','column2','column3',...]);

쿼리 작성기 사용 :

DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);

0

내가 이것을 잘 이해했다면 하나의 열만보고 싶은 것을 제외하고는 반환되는 것이 좋습니다. 그렇다면 아래는 훨씬 더 간단해야합니다.

return Response::eloquent(Theme::with('user')->get(['username']));

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.