¿Cómo obtener valores distintos para campos de columna sin clave en Laravel?


Esto puede ser bastante fácil, pero no tengo idea de cómo hacerlo.

Tengo una tabla que puede tener valores repetidos para un campo de columna no clave en particular. ¿Cómo escribo una consulta SQL usando Query Builder o Eloquent que obtendrá filas con valores distintos para esa columna?

Tenga en cuenta que no estoy recuperando esa columna solo, está en conjunción con otros valores de columna, por lo que distinct() podría no funcionar realmente. Así que esa pregunta básicamente puede ser cómo especificar la columna que quiero que sea distinta en una consulta, ahora que distinct() no acepta parámetros?

Author: Rishabh, 2014-08-10

7 answers

Debe usar groupby. En Query Builder puedes hacerlo de esta manera:

$users = DB::table('users')
            ->select('id','name', 'email')
            ->groupBy('name')
            ->get();
 70
Author: Marcin Nabiałek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-10 13:08:55

En Eloquent también puede consultar de la siguiente manera:

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

 34
Author: Pathros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-30 16:25:03

En eloquent puedes usar esto

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

GroupBy en realidad está obteniendo los distintos valores, de hecho el groupBy categorizará los mismos valores, para que podamos usar funciones agregadas en ellos. pero en este escenario no tenemos funciones agregadas, solo estamos seleccionando el valor que hará que el resultado tenga valores distintos

 20
Author: Salar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-12 22:03:36

Aunque llego tarde a responder a esto, un mejor enfoque para obtener registros distintos utilizando Eloquent sería

$user_names = User::distinct()->get(['name']);
 6
Author: rsakhale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-06 04:35:05

Tenga en cuenta que groupBy como se usa anteriormente no funcionará para postgres.

Con distinct es probablemente una mejor opción - p. ej. $users = User::query()->distinct()->get();

Si utiliza query puede seleccionar todas las columnas según lo solicitado.

 2
Author: jec006,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-22 15:14:59

Agrupar por no funcionará si las reglas de la base de datos no permiten que ninguno de los campos select esté fuera de una función aggregate. En su lugar, utilice las colecciones laravel .

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

foreach($users->unique('name') as $user){
  //....
}
 1
Author: Jed Lynch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-11 18:26:50

$users = User::select('column1', 'column2', 'column3')->distinct()->get(); recupera los tres coulmns para filas distintas en la tabla. Puede agregar tantas columnas como desee.

 0
Author: MacHero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-07 15:51:09