Mais uma pra tentar facilitar a vida dos zendeiros.
Imaginemos a situação onde temos que cadastrar um carro num db.
Vamos registrar o modelo e a cor.
MAS, em vez de usar um campo de cores direto na tabela dos carros, criamos uma tabela de cores separado ( o que ajudaria muito a criar um 'form select' com as opções de cores, por exemplo ) e depois vamos associar a cada carro da tabela de carros, uma cor da tabela de cores.
Sentiram a situação ?
Pois bem, para esse problema, temos as tabelas e os campos
A idéia é intuitiva: a cada 'id' de 'carros', associamos um 'id_cor' que corresponde ao 'id' da tabela 'cores', e dai queremos pegar o nome da cor correspondente ao 'id' em 'cores'.
Pra fazer isso no Zend é bem simples ( agora que aprendi é simples, claro ¬¬ ).
Criemos dois models: um pra tabela 'carros', e outro pra tabela 'cores':
$ zf create model carros
$ zf create model cores
Pois bem, no model 'Carros.php', temos a classe 'Application_Model_Carros'
Imaginemos a situação onde temos que cadastrar um carro num db.
Vamos registrar o modelo e a cor.
MAS, em vez de usar um campo de cores direto na tabela dos carros, criamos uma tabela de cores separado ( o que ajudaria muito a criar um 'form select' com as opções de cores, por exemplo ) e depois vamos associar a cada carro da tabela de carros, uma cor da tabela de cores.
Sentiram a situação ?
Pois bem, para esse problema, temos as tabelas e os campos
carros cores
id id
modelo cor
id_cor
A idéia é intuitiva: a cada 'id' de 'carros', associamos um 'id_cor' que corresponde ao 'id' da tabela 'cores', e dai queremos pegar o nome da cor correspondente ao 'id' em 'cores'.
Pra fazer isso no Zend é bem simples ( agora que aprendi é simples, claro ¬¬ ).
Criemos dois models: um pra tabela 'carros', e outro pra tabela 'cores':
$ zf create model carros
$ zf create model cores
Pois bem, no model 'Carros.php', temos a classe 'Application_Model_Carros'
<?php class Application_Model_Carros extends Zend_Db_Table_Abstract { protected $_name = 'carros'; protected $_primary = 'id'; }
e no model 'Cores.php', temos a classe 'Application_Model_Cores'
<?php class Application_Model_Cores extends Zend_Db_Table_Abstract { protected $_name = 'cores'; protected $_primary = 'id'; }
onde percebe-se que já definimos as tabelas de cada model e os devidos primary keys.
Agora, pra relacionar o campo 'ide_cores' da tabela carros ao campo 'id' da tabela 'cores', declaramos no model 'Application_Model_Carros' a sua dependencia com a tabela 'cores' assim:
<?php class Application_Model_Carros extends Zend_Db_Table_Abstract { protected $_name = 'carros'; protected $_primary = 'id'; // Declara a dependencia da tabela 'carros' com a tabela 'cores' // através do model 'Application_Model_Cores'. protected $_dependentTables = array('Application_Model_Cores'); }
E acabamos com a parte do model para os carros.
No model 'Application_Model_Cores', devemos criar os relacionamentos entre os campos. Para isso, fazemos
<?php class Application_Model_Cores extends Zend_Db_Table_Abstract { protected $_name = 'cores'; protected $_primary = 'id'; protected $_referenceMap = array( 'refCores' => array( 'refTableClass' => 'Application_Model_Carros', 'refColumns' => array('id_cor'), 'columns' => array('id') ) ); }
onde a variável especial '$_referenceMap' cria o mapa de associação desejado entre as tabelas.
Nos arrays, temos que
- 'refCores' é apenas um label para esse mapeamento, pode ter qualquer nome que você queira
- 'refTableClass' é classe da tabela pai que depende da tabela 'cores' ( que é a filha )
- 'refColumns' é o campo da tabela pai que está relacionado com um campo da tabela filha ( no caso, o campo 'id_cor' da tabela pai se relaciona com o campo 'id' da tabela filha )
- 'columns' é o campo da tabela filha que é requerido pela relação com o campo 'refColumns' da tabela 'pai'.
E isso finaliza o nosso tratamento com os models.
Agora, no controller onde você vai trabalhar ( usaremos aqui como exemplo 'Dados.php' ), digite no seu action
<?php class DadosController extends Zend_Controller_Action { public function init(){ /* Initialize action controller here */ } public function indexAction(){ // Criamos o objeto do model da tabela 'carros'. $carrosModel = new Application_Model_Carros(); // Pegamos o carro de 'id' igual a 3. $carros = $carroModel->fetchRow('id=3'); // Aqui pegamos os campos das cores relativos ao carro de 'id' // igual a 3. $cores = $carros->findDependentRowSet("Application_Model_Cores"); // Imprime o modelo e a cor do carro de 'id' igual a 3. print "Modelo :: ".$carros['modelo']; print "Cor :: ".$cores[0]['cor']; } }
O que ocorre é simples: fazemos um 'fetchRow' para pegar os campos do carro de 'id' igual a 3 e salvamos no array '$carros'.
Com o método 'findDependentRowSet' pegamos os campos da tabela 'cores' correspondente ao 'id_cor' do carro, conforme as relações entre tabelas que configuramos e salvamos no array '$cores'.
O resto já conhecemos.
Então, podem ir atacando o zend, que mais essa foi resolvida.
Até a próxima.
Referências:
UOL Host : Zend Framework: Relacionamento de tabelas com o Zend_Db_Table
Zend Manual : Zend_Db_Table Relationships
Muito bom.. Parabéns.
ResponderExcluirValeu :D
ExcluirEste comentário foi removido pelo autor.
ResponderExcluir