Foros del Web » Programando para Internet » PHP » Zend »

Zend Framework - DbTable - update

Estas en el tema de Zend Framework - DbTable - update en el foro de Zend en Foros del Web. Una consulta rápida. Estoy usando la clase DbTable de Zend, en la que he creado una función publica para hacer un update de la tabla ...
  #1 (permalink)  
Antiguo 06/09/2010, 03:32
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 20 años, 2 meses
Puntos: 71
Zend Framework - DbTable - update

Una consulta rápida.
Estoy usando la clase DbTable de Zend, en la que he creado una función publica para hacer un update de la tabla (además de un get, insert....) pero me pasa algo excesivamente raro que no alcanzo a comprender.

La clase es más o menos así:
Código PHP:
class Application_Model_DbTable_Categories extends Zend_Db_Table_Abstract
{
    protected 
$_name 'tbl_categories';
    protected 
$_primary 'id_category';

// Aqui hay mas codigo...
    
    
public function updateCategory($data$id)
    {
      if (
is_array($data))
        return 
$this->update($data$this->_primary[1] . ' = ' . (int)$id);
    }
// Aqui sigue el codigo...


Como veis, declaro un $_primary para identificar la llave primaria, cuando hago el insert, select o delete, uso $this->_primary, tal cual, pero en el update, como veis, uso un array, básicamente por que si uso $this->_primary me dice que nanai y si hago un var_dump en update, es un array, cuando en el resto de funciones es un string.

Alguien sabe por que pasa eso, si es normal o es algun tipo de bug o similar
  #2 (permalink)  
Antiguo 07/09/2010, 08:10
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 9 meses
Puntos: 45
Respuesta: Zend Framework - DbTable - update

Define el $_primary como un array,

Código PHP:
Ver original
  1. protected $_name = 'tbl_categories';
  2. protected $_primary = array('id_category');

Saludos!
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #3 (permalink)  
Antiguo 07/09/2010, 08:14
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 20 años, 2 meses
Puntos: 71
Respuesta: Zend Framework - DbTable - update

Cita:
Iniciado por Genetix Ver Mensaje
Define el $_primary como un array,

Código PHP:
Ver original
  1. protected $_name = 'tbl_categories';
  2. protected $_primary = array('id_category');

Saludos!
Pero... con eso que consigo? lo que veo, y acabo de probar, es que con esa modificación $this->_primary lo obligo a que sea un array, y yo lo que quiero saber, es por que en el metodo del update, el sistema me convierte esa variable de un string a un array, sin yo decirselo.

No se si me explico.
  #4 (permalink)  
Antiguo 07/09/2010, 08:20
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 9 meses
Puntos: 45
Respuesta: Zend Framework - DbTable - update

cual es el mensaje de error que te muestra ?
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #5 (permalink)  
Antiguo 07/09/2010, 08:37
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 20 años, 2 meses
Puntos: 71
Respuesta: Zend Framework - DbTable - update

Cita:
Iniciado por Genetix Ver Mensaje
cual es el mensaje de error que te muestra ?
Tal y como lo tengo ahora, con mi código, ninguno, con el tuyo me muestra este:
Cita:

An error occurred
Application error
Exception information:

Message: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Array' in 'where clause'
Stack trace:

#0 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)
#1 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Db/Adapter/Abstract.php(468): Zend_Db_Statement->execute(Array)
#2 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('UPDATE `tbl_cat...', Array)
#3 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Db/Adapter/Abstract.php(604): Zend_Db_Adapter_Pdo_Abstract->query('UPDATE `tbl_cat...', Array)
#4 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Db/Table/Abstract.php(1109): Zend_Db_Adapter_Abstract->update('tbl_categories', Array, 'Array = 5')
#5 /home/ivan/Dropbox/www/staticsGP/staticsGP/models/DbTable/Categories.php(45): Zend_Db_Table_Abstract->update(Array, 'Array = 5')
#6 /home/ivan/Dropbox/www/staticsGP/staticsGP/controllers/CategoriesController.php(109): Application_Model_DbTable_Categories->updateCategory(Array, 5)
#7 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Controller/Action.php(513): CategoriesController->editAction()
#8 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('editAction')
#9 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#10 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#11 /home/ivan/Dropbox/www/ZendFramework-1.10.7/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#12 /home/ivan/Dropbox/www/staticsGP/index.php(51): Zend_Application->run()
#13 {main}

Request Parameters:

array (
'controller' => 'categories',
'action' => 'edit',
'id' => '5',
'module' => 'default',
'id_category' => '5',
'name_category' => 'afvqafq',
'description_category' => 'sdgxzb',
'submit' => 'Editar',
)
Y aquí el código completo, el mio:
Código PHP:
class Application_Model_DbTable_Categories extends Zend_Db_Table_Abstract
{
    
// Nombre de la tabla
    
protected $_name 'tbl_categories';
    
    
// Nombre del campo primario de la tabla $_name.
    
protected $_primary 'id_category';

    public function 
getCategory($id)
    {
      
// Buscamos el id de la categoria dada
      
$row $this->fetchRow($this->_primary ' = '. (int)$id);
      
      
// si no la encontramos, devolvemos null
      
if (!$row) return null;
      
      
// Si la encontramos, devolvemos un array
      
return $row->toArray();
    }
    
    public function 
addCategory($data)
    {
      
// Si hemos enviado un array para los datos, los insertamos.
      
if (is_array($data)) {

        
// La categoria existe, no podemos continuar.
        
if ($this->_getCategoryByName($data['name_category'])) return ROW_EXISTS;

        
// Devolvemos el id de la fila insertada.
        
return $this->insert($data);
      }
    }
    
    public function 
updateCategory($data$id)
    {
      
// Si hemos enviado un array con los datos necesarios, hacemos el update.
      
if (is_array($data))
        
// Devolvemos el numero de filas afectadas
        /* NOTA: Por alguna razon que desconozco, aqui, $this->_primary es
         * convertido a un array, con lo que debo usarlo como tal para que
         * no me de ningun error al ejecutar el update.
         */
        
return $this->update($data$this->_primary[1] . ' = ' . (int)$id);
    }
    
    public function 
deleteCategory($id)
    {
      
// Eliminamos la fila segun el id dado, devolvemos el numero de filas eliminadas.
      
return $this->delete($this->_primary ' = ' . (int)$id);
    }
    
    public function 
getAllCategories()
    {
      
// Recogemos todas las filas
      
$row $this->fetchAll();
      
      
// Si no hay filas, devolvemos null
      
if (!$row) return null
      
      
// Si hay filas, las devolvemos como un objeto.
      
return $row;
    }
    
    private function 
_getCategoryByName($name_category '') {
      
// buscamos una categoria por el nombre
      
$row $this->fetchRow("name_category = '" $name_category "'");
      
// Si encontramos la categoria que buscamos, devuelve true, sino false.
      
return ($row) ? true false;
    }


Entiende perfectamente el error que me da, lo que no entiendo el comportamiento, nose si me explico, si ves el código completo, quizas veas la diferencia que debo de poner, y no entiendo el porque.

Saludos.
  #6 (permalink)  
Antiguo 07/09/2010, 09:00
Avatar de oswaldochc  
Fecha de Ingreso: octubre-2009
Ubicación: Ecuador
Mensajes: 41
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Zend Framework - DbTable - update

Segun he leido ese campo esta preparado para recibir tanto un array como una sentecia sql, sin embargo cuando lo he utilizado siempre me pedia un array, tal vez por ello te pide la llave como array.
prueba lo siguiente para ver si funciona.
Código PHP:
$where[] = $this->_db->quoteInto($this->_primary .  ' = ?'$id);
$this->update($data,$where); 
Saludos
  #7 (permalink)  
Antiguo 07/09/2010, 09:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework - DbTable - update

Publica la parte de tu controller donde haces el llamado, puede que ahí este el problema.

Saludos.
  #8 (permalink)  
Antiguo 07/09/2010, 09:56
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 20 años, 2 meses
Puntos: 71
Respuesta: Zend Framework - DbTable - update

Así lo llamo desde el controlador
Código PHP:
...
if (
$this->_categories->updateCategory($datos$id) > 0) {
... 






PD: Me han sentado bien los puntos por "infracción"
  #9 (permalink)  
Antiguo 07/09/2010, 10:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework - DbTable - update

Como instancias $this->_categories???

Saludos.
  #10 (permalink)  
Antiguo 07/09/2010, 10:14
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 20 años, 2 meses
Puntos: 71
Respuesta: Zend Framework - DbTable - update

Código PHP:
...
    protected 
$_categories;

    public function 
init()
    {
      
// Creamos unas instancia del modelo para la tabla categorias
      
$this->_categories = new Application_Model_DbTable_Categories();
    }
... 
Si hace falta pongo el código completo del controlador, pero creo que es innecesario.
Saludos.
  #11 (permalink)  
Antiguo 07/09/2010, 10:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework - DbTable - update

Es muy raro que cambie de ser un string a un array ya que si tu lo defines no debería de cambiar, el único que lo cambia es el método setup.
  #12 (permalink)  
Antiguo 07/09/2010, 10:33
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 20 años, 2 meses
Puntos: 71
Respuesta: Zend Framework - DbTable - update

Si yo tambien me he sorprendido, pero es así como me pasa, de hecho, para comprobarlo, hago un var_dump, y éste me lo confirma, me lo cambia a un array, y evidentemente, al usar $this->_primary en el metodo updateCategory me salta una excepción.

Me gustaría saber si a alguno mas le pasa, si usa Db_Table y tiene este "problema" o es sólo cosa mia, si es así, me resignaré y usare un array en el update :(

Saludos!


PD: Cuando me comentabas que querías ver el resto del código, era por que intuías algo, qué era?
  #13 (permalink)  
Antiguo 07/09/2010, 11:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework - DbTable - update

Puede ser que sea un bug, lo puedes reportar en el tracker de Zend Framework, personalmente no uso el update así como lo propones, uso el update directo desde un objeto row siempre.

Saludos.
  #14 (permalink)  
Antiguo 07/09/2010, 14:07
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 20 años, 2 meses
Puntos: 71
Respuesta: Zend Framework - DbTable - update

Dónde puedo ver si ya existe el bug y dónde añadirlo? he mirado en la web oficial, y no encuentro nada sobre bug's
  #15 (permalink)  
Antiguo 07/09/2010, 15:00
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework - DbTable - update

http://framework.zend.com/issues/
  #16 (permalink)  
Antiguo 08/09/2010, 04:30
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 20 años, 2 meses
Puntos: 71
Respuesta: Zend Framework - DbTable - update

Bien, yo buscaba un "Bug Track" :)

Añadido el bug, a ver que me contestan, si es que realmente es un bug.

Etiquetas: framework, php, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:12.