Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/09/2012, 13:07
anata
 
Fecha de Ingreso: abril-2007
Mensajes: 20
Antigüedad: 17 años, 7 meses
Puntos: 0
Pregunta Consultas y Relaciones de Tablas con Zend

En lo relacionado a Consultas y Relaciones en Tablas de Base de datos y Zend aun estoy un poco perdido. Un poco de ayuda no me caeria mal :D

Bueno veamos un poco del contexto:

Dos tablas Usuario y Pais.

Tabla Usuario:
Id - Username - Password - Salt - Nombres - Apellidos - Pais_id - etc.

Tabla Pais
Id - Nombre - Iso

Suponiendo que cada tabla pertenece a un modulo distinto, tendriamos dos tablas de tipo db-table:

Usuario_Model_DbTable_Usuario
Pais_Model_DbTable_Pais

Ahora las consultas:

Para obtener un listado de usuarios:

- Mysql: SELECT * FROM usuarios ORDER BY nombre LIMIT 20
- Zend:
Código PHP:
// modelo
$model = new Usuario_Model_DbTable_Usuario();
// consulta
$rowset $model->fetchAll(null'nombre',20);
// vista
$this->view->usuarios $rowset
Bien con esto tendo los datos del usuario y puedo mostrarlos en un datagrid.

Id - Nombres - Apellidos - Pais_id
1 - Juanito - Perez - 11
2 - Pepito - Torres - 11
3 - Pedrito - Garcia - 11

Ahora el detalle y el meollo del asunto: En lugar de mostrar el Pais_id como numero quiero mostrar el nombre.

En distintas ocasiones lo he solucionado de distinta forma:

- Usando Join:
Código PHP:
// modelo
$model = new Usuario_Model_DbTable_Usuario();
// consulta
$query $model->getAdapter()->select()->from(array('u'=>'usuario'))->joinLeft(array('p'=>'pais'), 'p.id = u.pais_id');
$rowset $model->getAdapter()->query($query)->fetchAll();
// vista
$this->view->usuarios $rowset
En la vista tengo los datos de ambas tablas y puedo mostrar el nombre del pais.

El problema que he tenido con esto es en el caso de paginacion al usar el adapter DbTableSelect. Cambiando el adapter funcionaria bien, pero me gusta ese adapter :D

- Otra ocasion use clases personalizadas para el Row.
Código PHP:
$model = new Usuario_Model_DbTable_Usuario();
$model->setRowClass('Usuario_Model_DbTable_UsuarioRow');
// en la clase
class Usuario_Model_DbTable_UsuarioRow extends Zend_Db_Table_Row_Abstract
{
    public function 
nombrePais(){
        
// aqui hacia otra consulta y retornaba el nombre
    
}    

El problema es que hace otra consulta para obtener el nombre, no me parece nada optimo :/

- otra cosa que intente, pero no conclui porque no lo termine de entender fueron las relaciones de tablas que da Zend: http://framework.zend.com/manual/en/zend.db.table.relationships.html

Bueno, la pregunta a la comunidad seria, ¿como lo trabajan ustedes?, cual seria la manera mas optima e eficiente al trabajar con varias tablas.

Gracias.