62
задан 17 November 2016 в 18:12

9 ответов

Необходимо использовать groupby. В Конструкторе запросов можно сделать это этот путь:

$users = DB::table('users')
            ->select('id','name', 'email')
            ->groupBy('name')
            ->get();
89
ответ дан 31 October 2019 в 13:11

В Красноречивом можно также запросить как это:

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

55
ответ дан 31 October 2019 в 13:11

в красноречивом можно использовать это

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

, groupBy на самом деле выбирает отличные значения, на самом деле groupBy категоризирует те же значения, так, чтобы мы могли использовать агрегатные функции на них. но в этом сценарии у нас нет агрегатных функций, мы просто выбираем значение, которое заставит результат иметь отличные значения

22
ответ дан 31 October 2019 в 13:11

Хотя я опаздываю для ответа на это, лучший подход для получения отличных записей, использующих Красноречивый, был бы

$user_names = User::distinct()->get(['name']);
13
ответ дан 31 October 2019 в 13:11

Обратите внимание, что groupBy, как используется выше не будет работать на пост-ГРЭС.

Используя distinct, вероятно, более оптимальный вариант - например, $users = User::query()->distinct()->get();

, Если Вы используете query, можно выбрать все столбцы согласно просьбе.

5
ответ дан 31 October 2019 в 13:11

$users = User::select('column1', 'column2', 'column3')->distinct()->get(); получает все три столбца для отличных строк в таблице. Можно добавить столько столбцов, сколько Вы желаете.

4
ответ дан 31 October 2019 в 13:11

Группировка не будет работать, если правила базы данных не позволят ни одному из избранных полей быть за пределами агрегатной функции. Вместо этого используйте 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;
         });

, Если необходимо выполнить итерации по большому количеству, добавив ключ к нему, решают проблему производительности.

4
ответ дан 31 October 2019 в 13:11
$users = Users::all()->unique('name');
1
ответ дан 31 October 2019 в 13:11

Я нашел, что этот метод, работающий вполне хорошо (для меня), произвел плоскую антенную решетку уникальных значений:

$uniqueNames = User::select('name')->distinct()->pluck('name')->toArray();

, Если Вы работали ->toSql() на этом конструкторе запросов, Вы будете видеть, что он генерирует запрос как это:

select distinct `name` from `users`

Эти ->pluck() обрабатывается illuminate\collection lib (не с помощью запроса SQL).

0
ответ дан 31 October 2019 в 13:11

Другие вопросы по тегам:

Похожие вопросы: