Необходимо использовать groupby
. В Конструкторе запросов можно сделать это этот путь:
$users = DB::table('users')
->select('id','name', 'email')
->groupBy('name')
->get();
В Красноречивом можно также запросить как это:
$users = User::select('name')->distinct()->get();
в красноречивом можно использовать это
$users = User::select('name')->groupBy('name')->get()->toArray() ;
, groupBy на самом деле выбирает отличные значения, на самом деле groupBy категоризирует те же значения, так, чтобы мы могли использовать агрегатные функции на них. но в этом сценарии у нас нет агрегатных функций, мы просто выбираем значение, которое заставит результат иметь отличные значения
Хотя я опаздываю для ответа на это, лучший подход для получения отличных записей, использующих Красноречивый, был бы
$user_names = User::distinct()->get(['name']);
Обратите внимание, что groupBy
, как используется выше не будет работать на пост-ГРЭС.
Используя distinct
, вероятно, более оптимальный вариант - например,
$users = User::query()->distinct()->get();
, Если Вы используете query
, можно выбрать все столбцы согласно просьбе.
$users = User::select('column1', 'column2', 'column3')->distinct()->get();
получает все три столбца для отличных строк в таблице. Можно добавить столько столбцов, сколько Вы желаете.
Группировка не будет работать, если правила базы данных не позволят ни одному из избранных полей быть за пределами агрегатной функции. Вместо этого используйте 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;
});
, Если необходимо выполнить итерации по большому количеству, добавив ключ к нему, решают проблему производительности.
Я нашел, что этот метод, работающий вполне хорошо (для меня), произвел плоскую антенную решетку уникальных значений:
$uniqueNames = User::select('name')->distinct()->pluck('name')->toArray();
, Если Вы работали ->toSql()
на этом конструкторе запросов, Вы будете видеть, что он генерирует запрос как это:
select distinct `name` from `users`
Эти ->pluck()
обрабатывается illuminate\collection lib (не с помощью запроса SQL).