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;
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;
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
}
}
- 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.