Autor Zpráva
Peet
Profil
Dobrý den, snažím se v zendu udělat jedoduchý JOIN a stále se mi nedaří.. už jsem pročetl snad všechny návody, ale stále to nějak nechápu, mohl by mi tu někdo pomoct ?

mám tabulku articles kde mám sloupec author_id a tabulku authors kde mám id,name. Potřebuji jednoduše mít ve výsledku vše z tabulky articles + jméno autora..

používám Zend_DbTable_Abstract následovně:

<?php

class Application_Model_DbTable_Articles extends Zend_Db_Table_Abstract {

    protected $_name = 'articles';


    public function getArticle($article_id) {
        $query = $this->select()->join('authors as a','a.id = articles.autor_id',array('a.name as jmeno'))->where('id=?', (int) $article_id)->order('id DESC');

        return $this->fetchAll($query);
    }

}

?>

Mockrát děkuji za pomoc.
Mike8748
Profil
$select = $this->select();
$select->setIntegrityCheck(false);
$query = $select->join(...);
Peet
Profil
Nefunguje ani tak..
Kajman
Profil
Jakou chybu to hlásí?
Peet
Profil
právě že žádnou.. jen je načtený layout a tam kde mám být layout()->content tak je prázdno..


Nevím zda nevadí že i v tabulce articles mám sloupec name.. stejně jako v autorech.
Mike8748
Profil
Peet:
a zkoušel sis vypsat $select jestli se ten dotaz sestavil správně jak si představuješ?

případně tedy co vrací fetchAll($select)?
Peet
Profil
nevím jak vypsat.. přes var_dump je furt prázdno.. ikdyž ve viewku smažu obsah a napíši tam ahoj tak ani to se nezobrazi, prostě to spadne někde v tom db modelu..
Peet
Profil
Problém je, že mi nefunguje ani toto:
class TestDb extends Zend_Db_Table_Abstract {
    public function testF(){
        $query = $this->select()->from('articles')->where('id=?',3);
        return $this->fetchRow($query);
    }
}

funguje to pouze takto:
class TestDb extends Zend_Db_Table_Abstract {

    protected $_name = 'articles';
    
    public function testF(){
        $query = $this->select()->where('id=?',3);
        return $this->fetchRow($query);
    }
}

Jakmile použiji funkci ->from(..) , tak nefunguje.. to same jako s join..
Mike8748
Profil
Peet:
třída musí obsahovat jméno tabulky s kterou souvisí (protected $_name)

pokud pro dotazování použiješ Zend_Db_Table_Select vytvořený metodou select() tak lze odkazovat pouze na tabulku pro kterou byl vytvořen (definováno právě $_name)
pokud chceš odkazovat na jinou tabulku např. pomocí join() tak je třeba danému selectu nastavit kontrolu integrity na false ( $select->setIntegrityCheck(false) ) jinak se nesestaví ten SQL dotaz.

druhá možnost je použít select() ne z Zend_Db_Table (tak jak to děláš teď) ale přímo z Zend_Db_Adapter. potom můžeš bez problémů použít ->from() atd
Peet
Profil
Toto mi ale také nefunguje:

class TestDb extends Zend_Db_Table_Abstract {
    public function testF(){
        $query = $this->select()->setIntegrityCheck('false')->from('articles')->where('id=?',3);
        return $this->fetchRow($query);
    }
}

A pokud použiji db adapter:

class TestDb extends Zend_Db_Adapter{
    public function testF(){
        $query = $this->select()->from('articles')->where('id=?',3);
        return $this->fetchRow($query);
    }

tak to skončí errorem. Mohu se tedy spíš zeptat takto: Když používáte join, jak ho použijete ? co je ideální pro pracování s db ? Předem mockrát díky :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: