School of Net


Relacionando tabelas com Zend Framework -

Filed under: Desenvolvimento — Tags: , , , — Wesley Willians @ 12:45

Em qualquer projeto, temos que poder relacionar uma tabela com a outra. O Zend framework possui essa funcionalidade de uma forma nativa. Basta configurar o Model da forma correta.

Exemplo:
Tableas: users e usersprofile

CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`login` varchar(20) collate utf8_unicode_ci NOT NULL,
`passwd` varchar(50) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY  (`id`),
UNIQUE KEY `login` (`login`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

INSERT INTO `users` (`id`, `login`, `passwd`) VALUES
(1, 'nomedasilva', '123');

CREATE TABLE `usersprofile` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) NOT NULL,
`nome` varchar(100) collate utf8_unicode_ci NOT NULL,
`email` varchar(100) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

INSERT INTO `usersprofile` (`id`, `user_id`, `nome`, `email`) VALUES
(1, 1, 'Nome da silva', 'nomedasilva@schoolofnet.com');

Model: Users.php

 'Users',
'refColumns' => 'id',
'columns' => 'user_id',
'onDelete'=> self::CASCADE,
'onUpdate'=> self::RESTRICT)
);
}

Controller: IndexController.php

view->users = $users->fetchAll();
}
}

View: index.phtml


Usuários: users as $user): ?> Login: login; ?> Nome: findDependentRowset('UsersProfile'); foreach ($perfil as $perfilOk): echo $perfilOk->nome; endforeach; ?>

Logo, podemos ver que na view utilizamos o comando: $user->findDependentRowset(‘UsersProfile’); ou seja, nesse caso ele automaticamente relaciona e acha a tabela dependente, no caso usersprofile e faz a relação. Neste exemplo só temos um registro, porém, isso pode e deve ser utilizado num relacionamento do tipo one-to-many.


6 Comentários »

  1. cara gostei do artigo… alias de duas semanas pra cá, que comecei a estudar o zend, to a cada dia me surpreendendo… pensei que só a turma do java que escrevia boas linhas de código (p/ web)… mas to revendo meus conceitos… e não é somente com o zend que esta de parabéns, mas o pessoal da ext também desenvolve um bom trabalho… flw!

    Comentário by — 29/07/2008 @ 0:09

  2. dé (rs),

    O PHP está evoluindo muito. Na realidade a cada nova versão mais “complexa” fica a linguagem no ponto de quem quiser programar ou desenvolver utilizando frameworks têm que necessariamente aprender OO (orientação a objetos), que na minha opinião é muito fácil, o grande ponto é que muitos aprenderam de outra forma e acabam se complicando:

    Um bom exemplo para isso é o Windows vs Linux.
    Quem começa aprendendo Linux antes do Windows acha linux muito fácil e muito bom, porém, se você começou pelo Windows é natual encontrar tal dificuldade com ambientes Linux.

    Abraços
    Wesley

    Comentário by Wesley — 29/07/2008 @ 12:24

  3. Muito boa explicação e exemplo!

    Agora, e se eu quisesse exibir somente os userprofiles que tivessem um id > 10 (Ex: where id>10)

    $user->findDependentRowset(’UsersProfile’);

    Daria pra fazer algo como abaixo? $user->findDependentRowset(’UsersProfile’)->where(‘id >10′);

    Abs

    Comentário by LeoCaseiro — 13/02/2009 @ 9:18

  4. Quando você usa esse método, você recebe o objeto inteiro na mão, logo, você pode usar todos os recursos da zend_db_table ou zend_db_select :)

    Comentário by Wesley — 13/02/2009 @ 9:36

  5. Wesley,

    ali no foreach do perfil, ao invés de usar o foreach, não seria melhor acessar diretamente o nome?
    pq no caso, só se precisa do nome do usuário e com o foreach todo o objeto do findDependentRowset seria percorrido, não?

    abs

    Comentário by Lucas Renan — 17/05/2009 @ 22:27

  6. Wesley,

    parabéns pelo post, mas aqui eu nao consegui cara…
    quando executo me gera o seguinte erro:

    Fatal error: Call to undefined method Zend_Db_Table_Rowset::findDependentRowset() in /var/www/siga/app/controllers/UserController.php on line 13

    talvez seja por eu estar usando o ZF 1.8.4

    poderia me ajudar?!!!

    abs

    Comentário by Giolvani — 09/07/2009 @ 11:58

RSS feed for comments on this post. TrackBack URL


Leave a comment