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