with updateorcreate tablas relacionadas obtener datos create consultas consultar php mysql zend-framework zend-db

php - tablas - updateorcreate laravel



Usando / Zend_Db_Table_Abstract:: find($ id). El campo SET de MySQL devuelve cadena en lugar de(deseado) int (1)

Después de que comenzó la recompensa noté que no había un anwer realmente simple, así que comencé a profundizar en Zend Framework 1.12 y los objetos de mapeo que uso. Me di cuenta de que el método ''find ()'' solo usa las columnas de la clave principal para crear una consulta. Entonces, comenzando con ese conocimiento construí mi propio método ''find ()'' que reside en el ''mapeador de modelos abstractos'' y usa el mapeador ''find ()'' dentro de la clase que extiende / Zend_Db_Table_Abstract

/* sample abstract mapper class with find */ abstract class MapperAbstract { /* * Zend db table abstract object * @var /Zend_Db_Table_Abstract */ private $DbTable; public function find($id, $Model) { $Select = $this->$DbTable->select(/Zend_Db_Table_Abstract::SELECT_WITH_FROM_PART); //Fetch record and populate model if we got //a result $Row = $this->$DbTable->fetchRow($Select); //do some extra shizzle if ($Row !== null) { return $Model->populate((array)$Row); } return; } }

Ahora necesito agregar un método que anule las columnas predeterminadas. Así que creé un método llamado ''overrideColumns ()'' que devuelve una matriz llena de nombres de columna que deben ser seleccionados o deben ser reemplazados.

/** * Returns array with columns that need to be overridden * or selected as extra * @return array */ public function overrideColumns() { return [''type'' => new /Zend_Db_Expr(''type+0'')]; }

Y a partir de ese punto solo tuve que ajustar la consulta $ Select para que usara el método ''overrideColumns ()''. Entonces la clase completa se convierte en algo así como:

/* sample abstract mapper class with find */ abstract class MapperAbstract { /* * Zend db table abstract object * @var /Zend_Db_Table_Abstract */ private $DbTable; /** * Returns array with columns that need to be overridden * or selected as extra * @return array */ private function overrideColumns() { return [''type'' => new /Zend_Db_Expr(''type+0'')]; } public function find($id, $Model) { $Select = $this->DbTable->select(/Zend_Db_Table_Abstract::SELECT_WITH_FROM_PART); //Check if we need to override columns in the select query $overrideColumns = $this->getOverrideColumns(); if (!empty($overrideColumns)) { $Select->columns($overrideColumns); //overrides the columns } //Add where clause to the query //I know there can also be a compound primary key, but //I''m just ignoring that in this example $Select->where($this->DbTable->getPrimaryKeyColumn() . '' = ?'', $id); //doing some extra shizzle //that is not important when I want to explain stuff //Fetch record and populate model if we got a result $Row = $this->DbTable->fetchRow($Select); if ($Row !== null) { return $Model->populate((array)$Row); } return; } }

Entonces ... después de un tiempo encontré la respuesta que estaba buscando, sin tener que declarar todas las columnas.

Pregunta básica ¿ Cómo puedo buscar la columna ''tipo'' como un valor entero dentro del mapeador de tablas?

Tengo una aplicación PHP Zend Framework 1.12 que ejecuta un sitio web. Dentro de MySQL hay varias tablas con múltiples columnas. Dentro de dos tablas utilizo el tipo SET. La columna se denomina ''tipo'' y como ''conjunto ('' LOCAL '','' EXTERNAL '')''. ¡No confunda este tipo de campo con ENUM por favor!

Hasta el momento no hay problemas, consultar la tabla y buscar la columna tipo INT o STRING no es un problema:

$Sql = $Db->select()->from(''tablename'', [''type_as_int'' => new /Zend_Db_Expr(''type+0'')]); //returns INT (if both are selected: 3) $Sql = $Db->select()->from(''tablename'', [''type'']); //returns STRING (if both are selected: LOCAL,EXTERNAL)

Pero, en esta aplicación también tiene mapeadores de tablas que extienden Zend_Db_Table_Abstract. Dentro del mapeador reside el método ''find ()''. Valor predeterminado incorporado en el resumen para buscar registros por su clave principal. Pero ... Cuando uso el objeto para buscar un registro, encuentro la siguiente respuesta dentro de mi método populate:

array([type] => LOCAL,EXTERNAL)

Consultarlo a mano (y definir las columnas yo mismo) sería una opción ($ this-> select () -> from ...), pero ¿no hay una manera más elegante?

(Sé que estoy usando una versión anterior de ZF, pero la actualización costaría demasiado tiempo en este momento).