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
<?php
class Users extends Zend_Db_Table_Abstract {
protected $_name = 'users';
protected $_primary = "id";
protected $_dependentTables = array('usersprofile');
}
class UsersProfile extends Zend_Db_Table_Abstract {
protected $_name = 'usersprofile';
protected $_primary = "id";
protected $_referenceMap = array(
array( 'refTableClass' => 'Users',
'refColumns' => 'id',
'columns' => 'user_id',
'onDelete'=> self::CASCADE,
'onUpdate'=> self::RESTRICT)
);
}
Controller: IndexController.php
<?php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$users = new Users();
$this->view->users = $users->fetchAll();
}
}
View: index.phtml
<hr>
<b>Usuários:</b>
<br /><br />
<? foreach($this->users as $user): ?>
<b>Login:</b> <?=$user->login; ?><br />
<b>Nome:</b>
<?
$perfil = $user->findDependentRowset('UsersProfile');
foreach ($perfil as $perfilOk):
echo $perfilOk->nome;
endforeach;
?>
<?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.




















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!
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
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
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
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
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