Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Silex + Doctrine DBAL y los campos choices

13 de noviembre de 2013

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

#1

@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

13 noviembre 2013, 22:31
#2

@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

14 noviembre 2013, 1:17