2012-10-11 68 views
12

Tengo una tabla SQL llamada 'marcas' con las columnas id, nombre, url. En esa mesa tengo este conjunto de datos:Utilizando el valor de una columna como índice en los resultados usando PDO

1, Solidfloor, solidfloor; 
2, Quickstep, quickstep; 
4, Cleanfloor, cleanfloor; 
5, Blue Dolphin, blue-dolphin; 
6, Krono, krono; 
8, Meister, meister; 

los estoy trayendo todo en este momento y conseguir un buen conjunto a cambio, pero, necesito el índice de las matrices no ser un número incrementado, pero la identificación de esa fila en particular. Por supuesto, podría recorrer el conjunto de resultados, pero ¿hay alguna forma más clara de hacerlo?

Respuesta

13

Explorar como Assoc

Para el manual: http://php.net/manual/en/pdostatement.fetchall.php

fetch_style

controla el contenido de la matriz devuelta como se documenta en PDOStatement :: fetch(). El valor predeterminado es PDO :: ATTR_DEFAULT_FETCH_MODE (que se predetermina a PDO :: FETCH_BOTH)

Para devolver una matriz que consta de todos los valores de una sola columna del conjunto de resultados, especifique PDO :: FETCH_COLUMN. Puede especificar qué columna quiere con el parámetro columna-índice.

Para recuperar solo los valores únicos de una sola columna del conjunto de resultados, bitwise-OR PDO :: FETCH_COLUMN con PDO :: FETCH_UNIQUE.

Devolver una matriz asociativa agrupada por los valores de una columna especificada, bitwise-OR PDO :: FETCH_COLUMN con PDO :: FETCH_GROUP.

Ese último bit es la clave. No parece estar completamente documentado (que pude encontrar), pero en lugar de PDO :: FETCH_COLUMN, puede combinar PDO :: FETCH_ASSOC con PDO :: FETCH_GROUP para lograr el resultado deseado:

$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP) 

Así , dados los datos arriba:

$stmt = $PDO_obj->prepare('select * from brands'); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP); 
d($result); 

resultados en:

array (6) [ 
    '1' => array (1) [ 
     array (2) [ 
      'name' => string (10) "Solidfloor" 
      'url' => string (10) "solidfloor" 
     ] 
    ] 
    '2' => array (1) [ 
     array (2) [ 
      'name' => string (9) "Quickstep" 
      'url' => string (9) "quickstep" 
     ] 
    ] 
    '4' => array (1) [ 
     array (2) [ 
      'name' => string (10) "Cleanfloor" 
      'url' => string (10) "cleanfloor" 
     ] 
    ] 
    '5' => array (1) [ 
     array (2) [ 
      'name' => string (12) "Blue Dolphin" 
      'url' => string (12) "blue-dolphin" 
     ] 
    ] 
    '6' => array (1) [ 
     array (2) [ 
      'name' => string (5) "Krono" 
      'url' => string (5) "krono" 
     ] 
    ] 
    '8' => array (1) [ 
     array (2) [ 
      'name' => string (7) "Meister" 
      'url' => string (7) "meister" 
     ] 
    ] 
] 

(d() es sólo una función de depuración práctico de la biblioteca Kint, como var_dump() o print_r())

Tenga en cuenta que la columna utilizada para indexar la matriz siempre será la primera columna en los resultados, por lo que puede modificar su declaración de selección para elegir la columna que desea. Y tenga en cuenta también que la columna indexada se eliminará de la matriz de cada fila; Para evitar eso, puede agregar la columna dos veces a su declaración de selección (es decir, select id, brands.* from brands, etc.).

Hay más parámetros documentados aquí: http://php.net/manual/en/pdostatement.fetch.php, como PDO :: FETCH_UNIQUE para asegurarse de que cada índice se use solo una vez.

+4

$ st-> fetchAll (PDO :: FETCH_ASSOC | PDO :: FETCH_GROUP); ¡Eso hizo el trabajo, gracias por la ayuda! –

12

Aunque la descripción de PDO::FETCH_UNIQUE en el manual de PHP no está clara, pero de hecho es exact parameter you actually need.

$data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE); 

te da una matriz indexada por el campo que figuran en la cláusula SELECT primero (cuando * se utiliza entonces primer campo en la definición de la tabla, que debe ser id en su caso).

Tenga en cuenta que, de forma predeterminada, con solo PDO::FETCH_UNIQUE, obtendrá filas resultantes con valores duplicados. Puede agregar el modo de fila preferido a esta llamada o, mejor, configurarlo una vez para todas las llamadas de PDO en el constructor o a través del setAttribute(). El resultado siguiente se muestra para PDO::FETCH_ASSOC establecido como modo de búsqueda predeterminado.

+1

exactamente lo que estaba buscando, gracias –

Cuestiones relacionadas