« Léo » 0 Denunciar post Postado Novembro 24, 2009 Fala Galera, Estou com dúvidas em como fazer corretamente o relacionamento das minhas tabelas no Zend. Segue as tabelas que preciso relacionar: /* Entidades */ clientes // Armazena os clientes contatos // Armazena os funcionarios das empresas (clientes) com quem nos relacionamos /* Formas de contato */ telefones // Armazena todos os telefones emails // Armazena todos os e-mails /* Extras sociais */ social // Armazena msn, skype, orkut, etc /* Tabelas de relacionamento */ rel_clientes_contatos // Relaciona os clientes aos seus contatos rel_clientes_telefones // Relaciona os clientes aos telefones (FK p/ clientes e telefones) rel_clientes_emails // Relaciona os clientes aos emails (FK p/ clientes e emails) rel_clientes_social // Relaciona os clientes às infos sociais (FK p/ clientes e social) rel_contatos_telefones // Relaciona os contatos aos telefones (FK p/ contatos e telefones) rel_contatos_emails // Relaciona os contatos aos emails (FK p/ contatos e emails) rel_contatos_social // Relaciona os contatos às infos sociais (FK p/ contatos e social)Logo, para descobrir quais os telefones dos clientes, preciso consultar as tabelas rel_clientes_telefones e telefones.Ou ainda, para descobrir quais os telefones dos CONTATOS dos clientes, preciso consultar as tabelas rel_clientes_contatos, rel_contatos_telefones e telefones. Confuso?! o.O rs Eu já consegui utilizar uma referencia simples: class Model_Funcionarios extends Zend_Db_Table_Abstract { protected $_name = 'funcionarios'; protected $_primary = 'BD_id'; protected $_dependentTables = array('Areas'); ... } class Model_Areas extends Zend_Db_Table_Abstract { protected $_name = 'areas'; protected $_referenceMap = array('Funcionarios' => array('columns' => 'BD_funcionario', 'refTableClass' => 'Model_Funcionarios', 'refColumns' => 'BD_id')); }No entanto não sei qual a melhor forma de utilizar o mesmo principio para um relacionamento tão extenso.Vou precisar criar um Model para cada tabela (inclusive as de simples relacionamento)? Idéias? Grato desde já. Abs Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Novembro 25, 2009 Fala Léo Porque você não tenta a seguinte estrutura. class Model_Contacts extends Zend_Db_Table_Abstract { protected $_name = 'tbl_contacts'; protected $_referenceMap = array( 'client' => array( 'columns' => array('client_id'), 'refTableClass' => 'tbl_clients', 'refColumns' => array('client_id') ) 'phone' => array( 'columns' => array('contact_id'), 'refTableClass' => 'tbl_phones', 'refColumns' => array('ref_id') ), 'email' => array( 'columns' => array('contact_id'), 'refTableClass' => 'tbl_email', 'refColumns' => array('ref_id') ) ); } Espero que isso te ajude Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Novembro 25, 2009 Fala srnetcave, sempre você me salvando né!! =) Então... como, além dos contatos, os clientes também podem ter telefones e emails, pode ocorrer de existir duas entradas com valor ref_id = 1, por exemplo, na tabela tbl_phones. Isto não seria um problema? A ideia de ter uma tabela so para telefones é q eu poderia aproveitar sua estrutura (e regras) para qualquer entidade que precisar de telefone no banco. Tanto para os já conhecidos clientes e contatos quanto para funcionários, parceiros, fornecedores, etc. Diante disto, ainda me aconselha a adotar a estrutura mencionada? Obs.: Antes de trazer o assunto para cá, cheguei a pôr esta dúvida de modelagem em discussão: http://forum.imasters.com.br/index.php?/topic/371848-relacionamento-com-formas-de-contatos/ Abs Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Novembro 26, 2009 Fala Léo, Fiz na correria ontem e esqueci de adicinar um ID para a tbl_phones. Quanto a duplicidade, o que acontece é o seguinte, ref_type seria como (1 = clientes, 2 = contatos). Com isso você acharia a referência exata a qual procura no banco. Agora, você pode fazer uma estrutura como a sua, e na sua array() da $_referenceMap apenas faça o relacionamento correto para suas tabelas. Você pode seguir o mesmo exemplo acima, apenas altere para suas tabelas de relação. Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Novembro 26, 2009 Blza srnetcave, Se consegui compreender, minha estrutura ficaria assim: class Model_Contatos extends Zend_Db_Table_Abstract { protected $_name = 'contatos'; protected $_referenceMap = array( 'clientes' => array( 'columns' => array('BD_id'), 'refTableClass' => 'clientes', 'refColumns' => array('BD_contato') ) 'telefones' => array( 'columns' => array('BD_id'), 'refTableClass' => 'rel_contatos_telefones', 'refColumns' => array('BD_contato') ), 'email' => array( 'columns' => array('BD_id'), 'refTableClass' => 'rel_contatos_emails', 'refColumns' => array('BD_contato') ) ); } * O refTableClass deve apontar para a classe referente à tabela ou direto para a tabela? Desta forma eu iria conseguir pegar as ID's dos telefones e e-mails, mas como eu pego o nº em si. Teria que criar a classe Model_Telefones e fazer o referenceMap por lá? Estou meio confuso com isto, mas minha ideia inicial era não precisar criar models para as tabelas de relacionamento. Desejo criar apenas para os clientes, contatos, telefones, emails, etc... Visto que este vão precisar de validação de dados, etc. Obrigado pela atenção. Abs Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Novembro 27, 2009 Léo, na verdade você tem que selecionar as rows que você deseja em seu SELECT tipo, digamos que você queira pegar o telefone de um contato. $sql = 'SELECT co.contact_id, ph.id, ph.ref_id, ph.ref_type, ph.phone_number, ph.phone_type FROM tbl_contacts co INNER JOIN tbl_phones ph ON co.contact_id = ph.ref_id WHERE ph.ref_type = 2'; //assumindo que 1 para ref_type=clients, 2 ref_type=contacts //aqui executamos o sql acima $result = $this->_db->query($sql); //agora você pode puxar qualquer valor que estiver incluso no select foreach ($result as $item) { echo $item['phone_number']; } Isso é apenas uma amostra de como você pode consultar. Simplesmente passe para o seu SELECT variables como $ref_type e $contact_id, apenas mude seu SELECT. tipo $sql = 'SELECT co.contact_id, ph.id, ph.ref_id, ph.ref_type, ph.phone_number, ph.phone_type FROM tbl_contacts co INNER JOIN tbl_phones ph ON co.contact_id = ph.ref_id WHERE ph.ref_type =' . $ref_type . 'AND co.contact_id =' . $contact_id; Acho que isso deve te ajudar, se tiver problemas pode postar ai flw Compartilhar este post Link para o post Compartilhar em outros sites
srnetcave 1 Denunciar post Postado Novembro 27, 2009 Blza srnetcave, Se consegui compreender, minha estrutura ficaria assim: class Model_Contatos extends Zend_Db_Table_Abstract { protected $_name = 'contatos'; protected $_referenceMap = array( 'clientes' => array( 'columns' => array('BD_id'), 'refTableClass' => 'clientes', 'refColumns' => array('BD_contato') ), <---AQUI FALTOU 1 VÍRGULA 'telefones' => array( 'columns' => array('BD_id'), 'refTableClass' => 'rel_contatos_telefones', 'refColumns' => array('BD_contato') ), 'email' => array( 'columns' => array('BD_id'), 'refTableClass' => 'rel_contatos_emails', 'refColumns' => array('BD_contato') ) ); } * O refTableClass deve apontar para a classe referente à tabela ou direto para a tabela? Desta forma eu iria conseguir pegar as ID's dos telefones e e-mails, mas como eu pego o nº em si. Teria que criar a classe Model_Telefones e fazer o referenceMap por lá? Estou meio confuso com isto, mas minha ideia inicial era não precisar criar models para as tabelas de relacionamento. Desejo criar apenas para os clientes, contatos, telefones, emails, etc... Visto que este vão precisar de validação de dados, etc. Obrigado pela atenção. Abs Apenas adicionei uma vírgula na região marcada Compartilhar este post Link para o post Compartilhar em outros sites