Llenar select en Laravel con Eloquent y Blade (Ejemplos prácticos)
Llenar un select en Laravel desde la base de datos es una tarea muy común en aplicaciones reales: formularios de clientes, categorías, sedes, roles, permisos, etc. A diferencia de PHP puro, Laravel ofrece una forma más limpia, segura y mantenible usando Eloquent y Blade.
En este artículo aprenderás cómo llenar un select en Laravel paso a paso, utilizando buenas prácticas, sin mysqli ni código procedural.
Requisitos previos
Antes de comenzar, asegúrate de contar con:
- Laravel 9, 10, 11 u 12
- Una base de datos configurada
- Un modelo Eloquent
- Conocimientos básicos de rutas, controladores y Blade
Escenario de ejemplo
Supongamos que tenemos una tabla categories con los siguientes campos:
- id
- name
- active
Y queremos mostrar esas categorías en un <select> dentro de un formulario.
1. Crear el modelo Eloquent
Si aún no tienes el modelo:
php artisan make:model CategoryModelo Category.php:
Declaramos el contenido de nuestro modelo.
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $table = 'categories';
protected $fillable = ['name', 'active'];
}2. Obtener los datos desde el controlador
En el controlador, consultamos la base de datos usando Eloquent.
use App\Models\Category;
public function create()
{
$categories = Category::where('active', 1)
->orderBy('name')
->get();
return view('products.create', compact('categories'));
}Buenas prácticas aplicadas:
- Uso de Eloquent (no SQL crudo)
- Filtro por estado activo
- Ordenamiento para mejor UX
3. Llenar el select en Blade
En la vista products/create.blade.php:
<div class="form-group">
<label for="category_id">Categoría</label>
<select name="category_id" id="category_id" class="form-control" required>
<option value="">Seleccione una categoría</option>
@foreach ($categories as $category)
<option value="{{ $category->id }}">
{{ $category->name }}
</option>
@endforeach
</select>
</div>De esta forma se logra llenar un select en Laravel usando Blade de manera limpia y legible.
4. Mantener la opción seleccionada (modo edición)
Cuando editas un registro, es importante mantener el valor seleccionado.
<option value="{{ $category->id }}"
{{ old('category_id', $product->category_id ?? '') == $category->id ? 'selected' : '' }}>
{{ $category->name }}
</option>Esto funciona tanto para:
- Formularios de edición
- Validaciones fallidas
5. Usando pluck() para un código más limpio (opcional)
Laravel permite simplificar la consulta:
$categories = Category::where('active', 1)
->orderBy('name')
->pluck('name', 'id');Y en blade se tiene que hacer lo siguiente:
@foreach ($categories as $id => $name)
<option value="{{ $id }}">{{ $name }}</option>
@endforeach6. Llenar select en Laravel con validación
En el controlador al inicio del método debemos de añadir estas lineas para verificar que la información enviada exista en la tabla categorías, esto para evitar alguna manipulación en la parte frontal de nuestro proyecto:
$request->validate([
'category_id' => 'required|exists:categories,id'
]);Esto garantiza que el valor enviado:
- Existe en la base de datos
- No fue manipulado
Errores comunes al llenar un select en Laravel
Hay algunos detalles que debemos de evitar a la hora de manejar Laravel tanto en los controladores y/o blades y estos son:
- Usar consultas SQL crudas innecesarias
- Consultar la base de datos directamente en la vista
- No validar el valor seleccionado
- No manejar el valor old()
Conclusión
Llenar un select en Laravel es un proceso sencillo si se siguen las buenas prácticas del framework. Usando Eloquent para obtener los datos y Blade para renderizarlos, obtienes un código:
- Más limpio
- Más seguro
- Más escalable
Este enfoque es ideal para proyectos profesionales y aplicaciones reales.