Cake PHP se unió a la consulta devuelta como matriz asociativa

OK, aquí está la estructura de mi table / model: los models están asociados apropiadamente.

estructura de la mesa

Estoy intentando consultar la sum del valor de retención para una ID de cliente determinada, con la date para una sum dada de valor como la key de la matriz.

Habiendo consultado los documentos, he producido los siguientes parameters para mi consulta en el model de Cliente:

$findParameters = array( 'conditions' => array( 'Account.client_id' => $clientId, 'Holding.holding_date = LAST_DAY(Holding.holding_date)', //gets month-end dates only 'MONTH(Holding.holding_date)' => array(3,6,9,12) //Use for quarter-end dates ), 'fields' => array( 'Holding.holding_date', 'SUM(Holding.value) AS portfolio_value' ), 'group' => array('Holding.holding_date') ); 

Cuando ejecuto la consulta haciendo

 $holdings = $this->Account->Holding->find( 'all', $findParameters ); 

Obtengo un resultado como este:

 Array ( [0] => Array ( [Holding] => Array ( [holding_date] => 2009-12-31 ) [0] => Array ( [portfolio_value] => 273239.07 ) ) [1] => Array ( [Holding] => Array ( [holding_date] => 2010-03-31 ) [0] => Array ( [portfolio_value] => 276625.28 ) ) ... 

Lo cual es genial, pero quiero el resultado en una matriz como esta:

 Array ( [2009-12-31] => 273239.07 [2010-03-31] => 276625.28 ... ) 

Entonces trato de hacer:

 $holdings = $this->Account->Holding->find( 'list', $findParameters ) 

Pero me sale el error:

 Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Account.client_id' in 'where clause' 

La consulta parece que ya no realiza las uniones en las tablas. ¿Alguna idea de por qué, dado que funciona bien si uso all lugar de list ? ¿Y cómo get mi resultado deseado?


EDITAR: He logrado mi resultado usando la class hash de Cake, pero me preguntaba si una consulta directa es un método superior y más eficiente.

Mi método:

  $holdings = $this->Account->Holding->find( 'all', $findParameters ); $values = Hash::extract($result, '{n}.0.portfolio_value'); $dates = Hash::extract($result, '{n}.Holding.holding_date'); $result = array_combine($dates, $values); return $result; 

Comentario general

El ORM de CakePHP es ideal para consultas fáciles de encontrar (incluido el group by sort …). Cuando se trata de cosas más avanzadas, necesitará procesar los datos recuperados en PHP o hacer consultas SQL simples .

Acerca de matrices asociativas

Model::find('all') o Model::find('first') siempre devolverá una matriz asociativa. Los otros methods de búsqueda devolverán diferentes types de matrices, pero no podrá get el resultado que está buscando utilizando funciones de model lists para usar.

Acerca de los campos que no se agregan al subcampo correcto

Para que su campo se muestre correctamente al juntar SUM() , AVG() o COUNT() , puede leer aquí sobre virtual fields en Consultas SQL

Cómo extraer / formatear matrices en CakePHP

La forma más fácil sería usar la class Hash para extraer y formatear los datos de la forma que desee.

Usando Hash::combine puedes lograr lo que estás buscando así:

 $result = Hash::combine($holdings, '{n}.Holding.holding_date', '{n}.0.portfolio_value'); 

Por favor, inténtalo

 $findParameters = array( 'conditions' => array( 'Account.client_id' => $clientId, 'Holding.holding_date = LAST_DAY(Holding.holding_date)', //gets month-end dates only 'MONTH(Holding.holding_date)' => array(3,6,9,12) //Use for quarter-end dates ), 'fields' => array( 'Holding.holding_date', 'SUM(Holding.value) AS portfolio_value' ), 'group' => array('Holding.holding_date'), 'contain' => array('Account), );