Poblar ‘drop-down list’ desde la DB con Laravel

¿Les suele pasar que crean una funcionalidad que ya existe y luego se dan cuenta que en vez de haber escrito 40 líneas de código el framework donde trabajan o el lenguaje que utilizan ya lo tiene implementado?. Bueno, a mi me pasa cada cierto tiempo, y hoy – hace muy poco – fue uno de esos momentos. A mi por lo menos me bajan la moral, por que claro, tu haces tu funcionalidad y dices “Wow!, está quedando genial, soy un maestro” y al rato después cuando descubres que eso ya estaba implementado te sientes pésimo, no por el hecho de que tu código está malo – y no lo está-, si no por el hecho de haber perdido el tiempo en re-inventar la rueda. Pero bueno, nadie es perfecto y no puedo saberme de memoria la documentación.

Voy a ser simple y conciso, porque la verdad escribo esto como recordatorio propio, aprovechando de compartir el “descubrimiento del día”.

En mi caso puntual estoy trabajando con una tabla llamada groups la cual contiene dos campos: id name. Mi usuario puede estar ligado sólo a un grupo, por lo cual necesito desplegar en la parte del administrador un listado con los grupos disponibles. Para ello, vamos a utilizar el helper Form con su método select.

La definición del método es la siguiente:

public function select($name, $list = array(), $selected = null, $options = array()){...}

Tenemos a $name donde se definimos el nombre del campo en el formulario. Luego está $list que es una matriz donde irán los elementos de la lista. El formato de esta matriz es (value, key), siendo value el nombre que se mostrará y value el valor de cada opción. Después encontramos a $selected donde definimos si queremos marcar por defecto cierta opción. Aquí debemos enviar el valor key a seleccionar. Finalmente está $options que como en la mayoría de los métodos de este helper son los atributos HTML que queremos agregar, en formato de matriz (atributo, valor).

Bien, vamos al controlador:

public function create()
{
	$data = ['groups' => Group::lists('name', 'id')];

	return View::make('users.create', $data);
}

Como select requiere de un array, he ocupado lists para generar una matriz en la cual voy a tener el nombre del grupo como valor y el id del grupo como llave. Eso lo almaceno en data y lo envío a la vista todos los grupos que estén en la tabla groups – deben tener generado el modelo -.

Esto no sólo puede ser utilizado con Eloquent, si no que también vía Query Builder:

public function create()
{
	$data = ['groups' => DB::table('groups')->lists('name', 'id')];

	return View::make('users.create', $data);
}

Ya en la vista:

{{ Form::select('group', $groups) }}

Llamamos a select indicando que va a tener un nombre group y que lo poblará con $groups. No he adjuntado ningún valor por defecto, debido a que Laravel automáticamente cuando enviamos el formulario y por ejemplo ocurre algún error y es mostrado de nuevo, toma el valor enviado y lo marca seleccionado en la lista.

Cuando vayan a realizar la vista de edición de un formulario, deberán ser capaces de marcar en la lista la opción que viene desde la base de datos y si luego el usuario cambia el grupo y existe algún error al enviar, deberán marcar la opción enviada y no la que viene desde la base de datos. Es algo simple de realizar, pero para que lo tengan en cuenta. Lo dejo como tarea.

Anuncios

11 comments

    1. Una buena solucion seria agregar consulta en el modelo y agregarlo a la respuesta de la siguente forma…


      class tumodelo extends Eloquent

      public function scopeLista($query)
      {
      $query= $this->orderBy('nombre')->lists('nombre','id');
      return ['' => 'Seleccione su Grupo'] + $query;
      }

      luego llamas a la consulta desde el controlador, finalmente desde el form, esto es efectivo cuando realizas CRUD desde el mismo form.

      Me gusta

      1. hola que pasa si quiero que en el select se muestren dos campos ejemplo un campo con un value id_usuarios y la s opciones sean (nombre_usuarios y apeido_usuarios) de usuario

        normal

        eduardo montoya

        como seria en laravel???

        Me gusta

    2. Con placeholder. Ejemplo:
      {!! Form::select(‘ciudades_buscador’, $ciudades, null, [‘class’=>’form-control’,’id’=>’ciudades_buscador’,’placeholder’ => ‘Seleccione’]) !!}

      Me gusta

  1. ya lo solucione gracias, lo dejo por si a alguien le pasa

    $productos = DB::table(‘productos ‘)
    ->select(‘id’, DB::raw(‘CONCAT(descripcion1, ” “, caracteristica) AS nombreproducto’))
    ->lists(‘nombreproducto’, ‘id’);

    $productos_options = array(” => “Seleccione … “) + $productos;

    Me gusta

Deja un comentario (puedes utilizar Markdown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s