Consulta SQL com JOIN

20 views
Skip to first unread message

Roger

unread,
Apr 1, 2008, 8:37:56 AM4/1/08
to zfbrasil
Caros estou penando para fazer um JOIN e capturar no .PHTML.

No meu IndexController.php exatamente no método listaAction coloquei
assim:

$select = $db->select()->from(array('c' => 'cidades'),
array('codigo_uf', 'nome_cidade'))
->join(array('u' => 'uf'),
'c.codigo_uf = u.codigo_uf');

$stmt = $db->query($select);
$this->view->lista = $stmt->fetchAll();


Ai na outra página preciso capturar um objeto algo que estou penando
demais:

no .PHTML esta assim:

<?php foreach($this->lista as $result) : ?>
<?php echo $this->escape($result->nome_cidade);?> / <?php echo $this-
>escape($result->sigla_uf);?></option>
<?php endforeach; ?>

Dá erro pois o $result não é um objeto, quero saber pois quando mexo
com uma tabela cria um objeto de um model que tem o nome da tabela,
nesse caso são 2 tabelas...como fazer???

MAYRON

unread,
Apr 1, 2008, 9:12:12 AM4/1/08
to zfbr...@googlegroups.com
Tenta mudar o fechAll por fechObject....
  $this->view->lista = $stmt->fetchObject();

Em 01/04/08, Roger <roger.o...@gmail.com> escreveu:

Roger

unread,
Apr 1, 2008, 9:45:47 AM4/1/08
to zfbrasil
Não deu cara...

Notice: Trying to get property of non-object in C:\Services\AppServ\www
\UF\application\views\scripts\index\lista.phtml on line 6
/


Olha como realmente esta meu código:

Tenho 2 tabelas:

uma de CIDADES e outra UF

então a idéia é listar CIDADES/UF

O IndexController.php está assim:

public function listaAction(){

$config = Zend_Registry::get('config');
$db = Zend_Db::factory($config->database);
Zend_Db_Table::setDefaultAdapter($db);

$this->view->titulo = "Listagem Cidade/UF";

$select = $db->select()->from(array('c' => 'cidades'),
array('codigo_uf',
'nome_cidade'))
->join(array('u' => 'uf'),
'c.codigo_uf = u.codigo_uf');

$stmt = $db->query($select);
$this->view->lista = $stmt->fetchObject();

$this->render();

$db->closeConnection();
}


No Model tenho apenas as classe Cidade.php e Uf.php que tem o seguinte
conteúdo:

class Cidade extends Zend_Db_Table
{
protected $_name = 'cidades';
}

_____________________________________________

class Uf extends Zend_Db_Table
{
protected $_name = 'uf';
}


No lista.phtml esta assim:

<?php foreach($this->lista as $result) : ?>
<?php echo $this->escape($result->nome_cidade);?> / <?php echo $this-
>escape($result->sigla_uf);?>
<?php endforeach; ?>


Ai quando executo dá o erro.

MAYRON

unread,
Apr 1, 2008, 9:51:36 AM4/1/08
to zfbr...@googlegroups.com
Olá eu n gosto de usar esse recurso do zend n, eu faço assim:

No model:
<?php
class Processo extends DefaultModel {
 
    protected $_name = 'processos.processo';

    function acompanharProcesso($id){
        $sql = ("select p.*, sp.idsituacao_processo, m.nome, sp.date,s.descricao
    , (select (min(sp2.date) - sp.date)
        from processos.processo p2, processos.situacao_processo sp2, processos.membros m2, processos.situacao s2
            where p2.idprocesso = p.idprocesso and p2.idprocesso = sp2.idprocesso and sp2.idsituacao_processo > sp.idsituacao_processo
                and sp2.idmembros = m2.idmembros and sp2.idsituacao = s2.idsituacao) as total_dias
    from processos.processo p, processos.situacao_processo sp, processos.membros m, processos.situacao s
        where p.idprocesso = $id and p.idprocesso = sp.idprocesso and sp.idmembros = m.idmembros and sp.idsituacao = s.idsituacao
            order by sp.idsituacao_processo");
        $stmt = $this->query( $sql );
 
        return $stmt->fetchAll();
    }

Coloquei esse exemplo que vc ta fazendo um join entre duas tabelas...
no controller vc faz:
$row = $processo->acompanharProcesso($id);

na view vc faz:
    <?php
        foreach($this->row as $r) {
            echo "<td>".$r['descricao']."</td>\n";
            echo "<td>".$r['nome']."</td>\n";
            echo "<td>".date('d/m/Y',strtotime($r['date']))."</td>\n";
            echo "<td>".$r['total_dias']."</td>\n";
            echo "</tr>";
        }
    ?>

--
Mayron Cachina Santiago
http://cachina.wordpress.com

Roger

unread,
Apr 1, 2008, 10:06:54 AM4/1/08
to zfbrasil
Mano deu o seguinte pau agora:



Warning: Zend_Loader::include_once(DefaultModel.php) [function.Zend-
Loader-include-once]: failed to open stream: No such file or directory
in C:\Services\AppServ\www\UF\library\Zend\Loader.php on line 83

Warning: Zend_Loader::include_once() [function.include]: Failed
opening 'DefaultModel.php' for inclusion (include_path='.;./library;./
application/models/;.;C:\php5\pear') in C:\Services\AppServ\www\UF
\library\Zend\Loader.php on line 83

Fatal error: Class 'DefaultModel' not found in C:\Services\AppServ\www
\UF\application\models\Processo.php on line 2



Olha como ficou o fonte:

IndexController.php

public function listaAction(){

$config = Zend_Registry::get('config');
$db = Zend_Db::factory($config->database);
Zend_Db_Table::setDefaultAdapter($db);

$this->view->titulo = "Listagem Cidade/UF";

$processo = new Processo();

$row = $processo->acompanharProcesso();

$this->render();

$db->closeConnection();
}


Model (Processo.php)

<?php
class Processo extends DefaultModel {

protected $_name = 'processos.processo';

function acompanharProcesso($id){
$sql = ("select c.codigo_uf,
c.nome_cidade,
u.codigo_uf,
u.sigla_uf
FROM
cidades c
JOIN
uf u
ON
c.codigo_uf = u.codigo_uf");

$stmt = $this->query( $sql );

return $stmt->fetchAll();

}
}
?>


o na visão (lista.phtml)

<?php foreach($this->row as $r) : ?>
<?php echo $r["nome_cidade"]; ?> / <?php echo $r["sigla_uf"]; ?>
<?php endforeach; ?>


E agora???

MAYRON

unread,
Apr 1, 2008, 10:14:45 AM4/1/08
to zfbr...@googlegroups.com
ih cara foi mal :D

eu tenho uma classe chamada DefaultModel, que é a parte de paginação e outros...
troca isso:

    class Processo extends DefaultModel {
por Isso:
    class Processo extends Zend_Db_Table {

outra coisa, protected $_name = 'processos.processo'; é o meu schema no banco, provavelmente vc não terá isso ai, vc tem que fazer com base em seu banco de dados, entendeu?

tenta fazer algo como:

class Cidade extends Zend_Db_Table
{
protected $_name = 'cidades';

       function getCidades($id){
               $sql = ("select c.codigo_uf,
                                               c.nome_cidade,
                                               u.codigo_uf,
                                               u.sigla_uf
                                FROM
                                               cidades c
                                JOIN
                                               uf u
                                ON
                                               c.codigo_uf = u.codigo_uf");

                $stmt = $this->query( $sql );

                return $stmt->fetchObject();

       }

Roger

unread,
Apr 1, 2008, 10:26:57 AM4/1/08
to zfbrasil
Cara ta quase lá agora esta dando erro na linha:

$stmt = $this->query($sql);


Fatal error: Call to undefined method Cidade::query() in C:\Services
\AppServ\www\UF\application\models\Cidade.php on line 20


O que será que esta acontecendo? Esse método QUERY() foi vc que
criou???

Altamiro Rodrigues

unread,
Apr 1, 2008, 10:29:26 AM4/1/08
to zfbr...@googlegroups.com
veja se isso ajuda http://neshertech.net/adler/2008/03/25/relacionamento-entre-tabelas-com-zend_framework/

Em 01/04/08, Roger <roger.o...@gmail.com> escreveu:



--
Altamiro Rodrigues
GTalk / MSN / E-mail: altam...@gmail.com
Celular : ( 75 ) 8806 - 8750
http://www.altamiro.info
Linux user # 450636
Ubuntu registered user # 16474

MAYRON

unread,
Apr 1, 2008, 10:31:21 AM4/1/08
to zfbr...@googlegroups.com
hehehehe
tb :D
mais uma vez foi mal
usa:
$this->_db->query($sql)

eu tento facilitar a vida la no trabalho mais as vezes complica né :D

Roger

unread,
Apr 1, 2008, 10:39:24 AM4/1/08
to zfbrasil
rsrs...

Cara fiz as alterações assim:

$stmt = $this->_db->query($sql);

return $stmt->fetchObject();


mas continua dando pau...heheh

Warning: Invalid argument supplied for foreach() in C:\Services\AppServ
\www\UF\application\views\scripts\cidade\lista.phtml on line 5

listaAction

public function listaAction(){

$config = Zend_Registry::get('config');
$db = Zend_Db::factory($config->database);
Zend_Db_Table::setDefaultAdapter($db);

$this->view->titulo = "Listagem Cidade/UF";

$cidade = new Cidade();

$row = $cidade->getCidade();

$this->render();

$db->closeConnection();
}


Model: (Uma dúvida quando mexo com mais de uma tabela tenho que
instanciar um objeto de qualquer classe do model?)

<?php
class Cidade extends Zend_Db_Table
{

protected $_name = 'cidades';


function getCidade(){
$sql = ("select c.codigo_uf,
c.nome_cidade,
u.codigo_uf,
u.sigla_uf
FROM
cidades c
JOIN
uf u
ON
c.codigo_uf = u.codigo_uf");


$stmt = $this->_db->query($sql);

return $stmt->fetchObject();

}


}

E no lista.phtml:

<?php foreach($this->row as $r) : ?>
<?php echo $r["nome_cidade"]; ?> / <?php echo $r["sigla_uf"]; ?>
<?php endforeach; ?>


Tá complicado o trem aqui..hehe

MAYRON

unread,
Apr 1, 2008, 10:42:10 AM4/1/08
to zfbr...@googlegroups.com
ja deu uma olhadinha em http://neshertech.net/adler/2008/03/25/relacionamento-entre-tabelas-com-zend_framework/
como o amigo Altamiro falou?
n to entendendo o erro n..


ah no meu index.php tem isso aqui na hora de configurar o banco
// Configuração do Banco
$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);
$registry->set('db', $db);

pode ser isso

Roger

unread,
Apr 1, 2008, 10:53:49 AM4/1/08
to zfbrasil
Cara creio q não seja isso...

On 1 abr, 11:42, MAYRON <mayroncach...@gmail.com> wrote:
> ja deu uma olhadinha emhttp://neshertech.net/adler/2008/03/25/relacionamento-entre-tabelas-c...

Wesley Moser

unread,
Apr 1, 2008, 10:15:44 PM4/1/08
to zfbr...@googlegroups.com
Crie uma view SQL ou uma Stored Procedure, mata a pau o problema!


Em 01/04/08, Roger<roger.o...@gmail.com> escreveu:
>

flaviogomesd...@gmail.com

unread,
Apr 2, 2008, 10:27:06 AM4/2/08
to zfbrasil
Olá, Roger, a essa altura você já deve ter resolvido, mas pegando o
problema do começo, creio que só tinha um detalhe a mudar.
Como eu não vi o seu código completo nem sei como é o banco, eu fiz um
exemplo "parecido".

Eu usei um banco MySQL. Vou passar as DDLs e DMLs:

CREATE DATABASE `localidade` ;

CREATE TABLE `UF` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nome` VARCHAR( 80 ) NOT NULL ,
INDEX ( `nome` )
) ENGINE = MYISAM ;

CREATE TABLE `CAPITAIS` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nome` VARCHAR( 80 ) NOT NULL ,
`id_uf` INT NOT NULL ,
INDEX ( `nome` , `id_uf` )
) ENGINE = MYISAM ;

iNSERT INTO `localidade`.`uf` (
`id` ,
`nome`
)
VALUES (
NULL , 'AC'
), (
NULL , 'AL'
), (
NULL , 'AM'
), (
NULL , 'AP'
), (
NULL , 'BA'
), (
NULL , 'CE'
), (
NULL , 'DF'
), (
NULL , 'ES'
), (
NULL , 'GO'
), (
NULL , 'MA'
), (
NULL , 'MG'
), (
NULL , 'MS'
), (
NULL , 'MT'
), (
NULL , 'PA'
), (
NULL , 'PB'
), (
NULL , 'PE'
), (
NULL , 'PI'
), (
NULL , 'PR'
), (
NULL , 'RJ'
), (
NULL , 'RN'
), (
NULL , 'RO'
), (
NULL , 'RR'
), (
NULL , 'RS'
), (
NULL , 'SC'
), (
NULL , 'SE'
), (
NULL , 'SP'
), (
NULL , 'TO'
);

iNSERT INTO `localidade`.`capitais` (
`id` ,
`nome`,
`id_uf`
)
VALUES (
NULL , 'Rio Branco',1
), (
NULL , 'Maceió',2
), (
NULL , 'Manaus',3
), (
NULL , 'Macapá',4
), (
NULL , 'Salvador',5
), (
NULL , 'Fortaleza',6
), (
NULL , 'Brasília',7
), (
NULL , 'Vitória',8
), (
NULL , 'Goiânia',9
), (
NULL , 'São Luís',10
), (
NULL , 'Belo Horizonte',11
), (
NULL , 'Campo Grande',12
), (
NULL , 'Cuiabá',13
), (
NULL , 'Belém',14
), (
NULL , 'João Pessoa',15
), (
NULL , 'Recife',16
), (
NULL , 'Teresina',17
), (
NULL , 'Curitiba',18
), (
NULL , 'Rio de Janeiro',19
), (
NULL , 'Natal',20
), (
NULL , 'Porto Velho',21
), (
NULL , 'Boa Vista',22
), (
NULL , 'Porto Alegre',23
), (
NULL , 'Florianópolis',24
), (
NULL , 'Aracaju',25
), (
NULL , 'São Paulo',26
), (
NULL , 'Palmas',27
);

Pra ficar bem simples mesmo, eu usei o indexAction do IndexController:

public function indexAction()
{
$db = Zend_Registry::get('db');
$select = $db->select()->from(array('u' => 'uf'),
array('UF' => 'nome'))
->join(array('c' => 'capitais'),
'u.id = c.id_uf',array('capital' =>
'nome'))
->order(array('UF'));

$stmt = $db->query($select);

$this->view->lista = $stmt->fetchAll();
}

No template index.phtml ficou assim:

<select name="name" size="4">
<?php
$lista = $this->lista;

foreach($lista as $result)
{
?>
<option value="<?=$this->escape($result['capital'])?>"><?=$this-
>escape($result['UF'])?>
</option>
<?php
}
?>
</select>

Bem, o resultado foi apresentado corretamente. O que tem de diferente
do que eu fiz para o que você fez?
Veja, eu chamei os atributos com chaves de array e não como
propriedades de um objeto. Estranho? Sim. Mas funciona. Assim que eu
recuperar meu login do Issue Tracker, vou reportar esse problema, se
alguém não fizer antes.

Só postei isso aqui porque o problema em si é simples de resolver.
Espero que sirva pra algo.

Roger

unread,
Apr 2, 2008, 12:56:24 PM4/2/08
to zfbrasil
É cara consegui resolver...mas valeu pela força.



On 2 abr, 11:27, "flaviogomesdasilvalis...@gmail.com"

Rodrigo Oliveira

unread,
Apr 17, 2008, 3:40:19 PM4/17/08
to zfbr...@googlegroups.com
como você fez roger? estou com a mesma dúvida.

Em 02/04/08, Roger <roger.o...@gmail.com> escreveu:
Reply all
Reply to author
Forward
0 new messages