cakephp cakephp-2.1

Agregue campo virtual dinĂ¡micamente en cakephp



cakephp-2.1 (3)

No hay forma (hasta donde yo sepa) de crear campos virtuales "sobre la marcha". Los campos virtuales son " expresiones SQL arbitrarias " que se ejecutarán cuando un hallazgo se ejecute a través del Modelo y "se indexará bajo la clave del Modelo junto con otros campos del Modelo".

¿Qué necesitas hacer con "campos virtuales creados dinámicamente"? Si explica qué es exactamente lo que necesita lograr, tal vez podamos proporcionar una solución diferente (¿incluso más adecuada? :)). Personalmente estaré encantado de ayudarte.

Después de editar tu pregunta, puedo decir que lo que obtienes es la forma en que se debe devolver la matriz, esto se debe al parámetro fields. Si desea obtener una estructura diferente, le sugiero que aplique una devolución de llamada para formatearla. Primero mueva el método dentro del CaseMaster Model :

public function getMaxCaseCount($client_id){ $data = $this->find(''first'', array( ''conditions'' => array( ''CaseMaster.CLIENT_ID'' => $client_id, ''CaseMaster.CASE_NO LIKE'' => ''%-%''), ''fields'' => array(''max(CaseMaster.CASE_NO) AS MAX_NO''))); return array_map(array(''CaseMaster'', ''__filterMaxCaseCount''), $data); } private function __filterMaxCaseCount($input){ //This is just an example formatting //You can do whatever you would like here. $output[''CaseMaster''] = $input[0]; return $output; }

La función array_map aplicará el método de devolución de llamada __filterMaxCaseCount para que cuando llame:

$this->CaseMaster->getMaxCaseCount($client_id);

desde su controlador obtendrá los datos de la manera que lo necesite. La función array_map también podría verse así:

return array_map(array($this, ''__filterMaxCaseCount''), $data);

porque estás en la misma clase.

Estoy usando CakePHP 2.1.3; Quiero crear un campo virtual dinámicamente en un controlador. ¿Es posible? El problema es cuando estoy tratando de encontrar el valor máximo en una tabla, me da otra matriz de la matriz modelo. Por favor, pregunte si necesita más información.

Cuando intento ejecutar la siguiente consulta,

$find_max_case_count = $this->CaseMaster->find(''first'', array( ''conditions'' => array( ''CaseMaster.CLIENT_ID'' => $client_id, ''CaseMaster.CASE_NO LIKE'' => ''%-%'' ), ''fields'' => array(''max(CaseMaster.CASE_NO) AS MAX_NO'') ));

Me está dando una matriz como:

[0]=> array([MAX_NO]=> 52)

Sin embargo, quiero que sea como:

[CaseMaster] => array([MAX_NO] => 52)


Encontré una solución. Puedo hacer el campo virtual en tiempo de ejecución. El código debería verse así:

$this->CaseMaster->virtualFields[''MAX_NO''] = 0;

Escríbalo justo encima de la consulta de búsqueda y la consulta se mantendrá igual a medida que fue escrita. Este enlace fue útil para descubrir la solución.


Solo agregar el alias de su modelo a la definición de campo también funciona para este propósito

''fields'' => array(''max(CaseMaster.CASE_NO) AS CaseMaster__MAX_NO'')