2012-10-11 13 views
5

Estoy en una situación en la que necesito ejecutar algunas consultas muy grandes, 25 ~ 30 uniones para generar algunos informes periódicos.obteniendo el resultado como matriz de dimensión única de la consulta cakephp

Ahora que ya tenemos estas consultas creadas y en funcionamiento, solo quiero volver a utilizarlas y, por lo tanto, utilicé el método de consulta del modelo de tortas.

dicen que mi código de modelo es como:

$this->query(
    'select emp.name,mngr.designation 
    from employee emp,manager mngr 
    where manager.emp_id=emp.id' 
) 

Resultado regrese es como:

Array 
(
    [0] => Array 
     (
      [emp] => Array 
      (
       [name] => "Tom" 
      ) 
      [mngr] => Array 
      (
       [designation] => "Developer" 
      ) 
     ) 
    [1] => Array 
     (
      [emp] => Array 
      (
       [name] => "Thomas" 
      ) 
      [mngr] => Array 
      (
       [designation] => "Developer Manager" 
      ) 
     ) 
) 

¿Hay alguna manera puedo obtener la siguiente estructura vanila llanura desde el conjunto de resultados cakephp

Array 
(
    [0] => Array 
     (
      [0]=>"Tom" 
      [1]=>"Developer" 
     ) 
    [1] => Array 
     (
      [0]=>"Thomas" 
      [1]=>"Developer Manager" 
     ) 
) 

o asociaciones solo a nivel de columna pero no a nivel de tabla

Array 
(
    [0] => Array 
     (
      [name]=>"Tom" 
      [designation]=>"Developer" 
     ) 
    [1] => Array 
     (
      [name]=>"Thomas" 
      [designation]=>"Developer Manager" 
     ) 
) 
+0

¿Has etiquetado tres versiones diferentes de Cake? ¿Cuál estás usando en realidad? –

+0

Sí Ben, en realidad estoy usando la versión 2.1.2 –

Respuesta

1

Usted puede obtener algo similar mediante el uso de alias de esta manera:

$this->query(
    'select emp.name AS emp__name, mngr.designation AS mngr__destination 
    from employee emp,manager mngr 
    where manager.emp_id=emp.id' 
) 

doble guión __ es importante! Eche un vistazo también en el tema Sub-queries.

+0

Gracias, bancer, descubrí lo mismo. es hacer más con virtualFieldSeparator, se explicará lo mismo que con otra respuesta –

1

Escriba su consulta como View y cree un modelo de Cake cuya 'tabla' es esa vista.

Si no puede hacer esto, entonces deberá repetir los resultados y convertirlos al formato que desee. Creo que encontrarás el Set class muy útil aquí.

+0

Gracias Ben, parece que tendré que pasar por mí o como sugirió utilizar la clase Set para reestructurar el resultado, solo me preocupa que sea un informe y un bucle para un gran conjunto de datos será un costo adicional dado que la torta ya está haciendo cosas similares al crear una. –

1

Al profundizar un poco más en el archivo MySql.php de Cake framework, hay un método resultSet que hace todas las asignaciones/asociaciones.

public function resultSet($results) { 
    $this->map = array(); 
    $numFields = $results->columnCount(); 
    $index = 0; 

    while ($numFields-- > 0) { 
     $column = $results->getColumnMeta($index); 
     if (empty($column['native_type'])) { 
      $type = ($column['len'] == 1) ? 'boolean' : 'string'; 
     } else { 
      $type = $column['native_type']; 
     } 
     if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) === false) { 
      $this->map[$index++] = array($column['table'], $column['name'], $type); 
     } else { 
      $this->map[$index++] = array(0, $column['name'], $type); 
     } 
    } 
} 

Aquí declaración a tener en cuenta es

if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) === false) 

por lo que si el nombre de columna contiene un virtualfieldseparator que por defecto es que la columna __ conseguirá asociado con el índice 0 en lugar del nombre de tabla.

Cuestiones relacionadas