Cuando trabajo con Silex y Doctrine (a través del DBAL) cómo puedo llenar los campos de tipo choice pasando un array donde las claves sean el valor del campo id de la tabla en la base de datos, ya que por defecto un fetchAll
genera un array con los datos de cada tupla obtenida de la base de datos, por ejemplo:
array( 0 => array(1 => "silex"), 1 => array(2 => "doctrine"), )
cuando lo que necesito es:
array( 1 => "silex", 2 => "doctrine", )
¿Existe alguna forma de obtener un array así directamente con Doctrine?
Respuestas
@raf1x, comprendo tu frustración porque a mí también me ha tocado lidiar con este problema :) La respuesta corta a tu pregunta sería: no es posible hacer lo que quieres con DBAL, así que tendrás que usar un for
o un while
para aplanar el array.
En realidad, PDO
sí que permite hacer algo así, pero DBAL no. En PDO
puedes utilizar el método PDO::FETCH_COLUMN
con fetchAll()
para obtener todos los valores de una única columna en forma de array plano. Tu código con PDO
quedaría algo así:
$sth = $dbh->prepare("SELECT id, name FROM ..."); $sth->execute(); $ids = $sth->fetchAll(PDO::FETCH_COLUMN, 0); $names = $sth->fetchAll(PDO::FETCH_COLUMN, 1);
Aunque es cierto que DBAL tiene un método llamado fetchColumn()
, su funcionamiento es muy diferente. Este método obtiene el valor de la columna cuyo número indicas como parámetro, pero solamente para el primer resultado devuelto por la columna:
// $ids sólo tiene el valor del $id del primer resultado de la búsqueda $ids = $app['db']->fetchColumn("SELECT id, name FROM ...", array(), 0);
PDO
va más allá y te permite incluso obtener el resultado de algunas columnas y agrupar los resultados por el valor de otra columna. Consulta los detalles en el Example #3 de la página del método PDOStatement::fetchAll en el manual oficial de PHP.
@javiereguiluz
@javiereguiluz, muchas gracias por tu respuesta. Al final fui haciendo $sth->fetch()
dentro de un while
para ir construyendo el array a mano:
$sth = $dbh->prepare("SELECT id, name FROM ..."); $sth->execute(); $aux = array(); while($row = $sth->fetch()){ $aux[$row['id']] = $row['name']; }
Ya después probaré como hacerlo mejor con las opciones de PDO
, porque realmente no me gusta mucho cómo se ve... :)
@raf1x