[laravel] Laravel에서 키가 아닌 열 필드에 대한 고유 값을 얻는 방법은 무엇입니까?

이것은 매우 쉬울 수 있지만 방법을 모릅니다.

특정 키가 아닌 열 필드에 대해 반복되는 값을 가질 수있는 테이블이 있습니다. 해당 열에 대해 고유 한 값이있는 행을 가져 오는 Query Builder 또는 Eloquent를 사용하여 SQL 쿼리를 작성하려면 어떻게해야합니까?

해당 열만 가져 오는 것이 아니라 다른 열 값과 연결되어 있으므로 distinct()실제로 작동하지 않을 수 있습니다. 그래서 그 질문은 기본적으로 distinct()매개 변수 를 허용하지 않는 쿼리에서 구별하려는 열을 지정하는 방법이 될 수 있습니까?



답변

을 사용해야합니다 groupby. Query Builder에서 다음과 같이 할 수 있습니다.

$users = DB::table('users')
            ->select('id','name', 'email')
            ->groupBy('name')
            ->get();


답변

Eloquent에서는 다음과 같이 쿼리 할 수도 있습니다.

$users = User::select('name')->distinct()->get();


답변

유창하게 사용할 수 있습니다

$users = User::select('name')->groupBy('name')->get()->toArray() ;

groupBy는 실제로 고유 한 값을 가져옵니다. 실제로 groupBy는 동일한 값을 분류하여 집계 함수를 사용할 수 있습니다. 그러나이 시나리오에서는 집계 함수가 없습니다. 결과에 고유 한 값이있는 값을 선택하는 것입니다.


답변

대답하기에는 늦었지만 Eloquent를 사용하여 고유 한 레코드를 얻는 더 나은 방법은

$user_names = User::distinct()->get(['name']);


답변

데이터베이스 규칙에서 선택 필드가 집계 함수 외부에있는 것을 허용하지 않는 경우 그룹화 기준이 작동하지 않습니다. 대신 laravel 컬렉션을 사용하십시오 .

$users = DB::table('users')
        ->select('id','name', 'email')
        ->get();

foreach($users->unique('name') as $user){
  //....
}

누군가는 이것이 대규모 컬렉션의 성능에 좋지 않을 수 있다고 지적했습니다. 컬렉션에 키를 추가하는 것이 좋습니다. 사용할 메서드는 keyBy 입니다. 이것은 간단한 방법입니다.

     $users = DB::table('users')
        ->select('id','name', 'email')
        ->get()
        ->keyBy('name');

keyBy를 사용하면 더 복잡한 작업에 대한 콜백 함수를 추가 할 수도 있습니다.

     $users = DB::table('users')
        ->select('id','name', 'email')
        ->get()
        ->keyBy(function($user){
              return $user->name . '-' . $user->id;
         });

대규모 컬렉션을 반복해야하는 경우 여기에 키를 추가하면 성능 문제가 해결됩니다.


답변

참고 groupBy위의 사용 포스트 그레스 작동하지 않습니다.

사용하는 distinct것이 아마도 더 나은 옵션 일 것입니다-예

$users = User::query()->distinct()->get();

사용하는 경우 query요청에 따라 모든 열을 선택할 수 있습니다.


답변

**

Laravel 5.8 용으로 테스트 됨

**

테이블에서 모든 열을 가져오고 싶으므로 모든 데이터를 수집 한 다음 Unique 라는 Collections 함수를 사용하여 필터링 할 수 있습니다.

// Get all users with unique name
User::all()->unique('name')

또는

// Get all & latest users with unique name 
User::latest()->get()->unique('name')

자세한 내용은 Laravel 컬렉션 문서를 확인 하세요.

편집 : Unique ()를 사용하면 먼저 User 테이블에서 모든 데이터를 얻은 다음 Laravel이 필터링합니다. 사용자 데이터가 많은 경우이 방법은 좋지 않습니다. 쿼리 작성기를 사용하고 사용하려는 각 필드를 호출 할 수 있습니다. 예 :

User::select('username','email','name')->distinct('name')->get();