Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

« Léo »

Relacionamento entre tabelas

Recommended Posts

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

Fala Léo

 

Porque você não tenta a seguinte estrutura.

 

Imagem Postada

 

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.