sábado, 19 de novembro de 2011

Você é meu amigo, não é ? :: Relacionamento de tabelas simples com Zend Models

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

                    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


3 comentários: