En Laravel, el método distinct permite obtener valores únicos de una columna específica de una tabla de base de datos. Esto es útil para evitar duplicados en los resultados al trabajar con modelos de Eloquent o consultas con el constructor de consultas (Query Builder).
distinct en Laravel
El método distinct se utiliza junto con select para especificar las columnas que deben ser consideradas en la consulta. Devuelve únicamente los valores únicos para esas columnas.
use Illuminate\Support\Facades\DB;
$categorias = DB::table('productos')
->select('categoria')
->distinct()
->get();
En este ejemplo:
categoria de la tabla productos.
Cuando trabajas con un modelo de Eloquent, puedes utilizar distinct de manera similar:
$categorias = Producto::select('categoria')
->distinct()
->get();
En este caso:
Producto es el modelo que representa la tabla productos.
categoria.
distinct
Si necesitas obtener valores únicos combinando varias columnas, puedes incluirlas en el select:
$datosUnicos = Producto::select('categoria', 'marca')
->distinct()
->get();
Este ejemplo devuelve combinaciones únicas de las columnas categoria y marca.
Puedes combinar distinct con cláusulas where para aplicar condiciones:
$categoriasActivas = Producto::select('categoria')
->distinct()
->where('activo', true)
->get();
Aquí se seleccionan categorías únicas de productos cuyo atributo activo sea true.
pluck para listas simples
Si solo necesitas una lista simple de valores únicos de una columna, puedes usar pluck:
$categorias = Producto::distinct()
->pluck('categoria');
El método pluck devuelve una colección con los valores de la columna especificada.
Supongamos que tienes una tabla productos con las siguientes columnas: id, nombre, categoria, y marca. Quieres obtener todas las categorías únicas de productos activos:
use App\Models\Producto;
$categoriasActivas = Producto::select('categoria')
->distinct()
->where('activo', true)
->get();
foreach ($categoriasActivas as $categoria) {
echo $categoria->categoria . "\n";
}
1. Ordenar los resultados:
Puedes usar orderBy para ordenar los valores únicos:
$categorias = Producto::select('categoria')
->distinct()
->orderBy('categoria', 'asc')
->get();
2. Considerar rendimiento:
Cuando trabajas con tablas grandes, combinar distinct con índices adecuados en la base de datos mejora significativamente el rendimiento.
3. Consulta en SQL:
Laravel traduce estas consultas a SQL estándar como:
SELECT DISTINCT categoria FROM productos;
Para más información sobre el uso de distinct y otras consultas avanzadas en Laravel, puedes consultar la documentación oficial de Eloquent.
Jorge García
Fullstack developer