Přepsání SQL dotazu do syntaxe nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xciza
Člen | 194
+
0
-

Hoj, začínám projekt propojovat s databází a nevím si rady s některými dotazy nad db.
V čistém php mám dotaz:

$jidla = mysql_query("SELECT * FROM polozka WHERE ID_Kategorie BETWEEN 1 AND 17 ORDER BY ID_kategorie, nazev", $dbc)or die("Chyba v dotaze: " . mysql_error());

ale teď bych ho potřeboval převést do podoby, kterou používá nette. Zatím mám toto:

public function renderDefault() {
        $this->template->polozka = $this->context->createPolozka()
                ->order('ID_kategorie ASC');
    }

ale nevím jak do toho zakomponovat to between 1 and 17??
Prosím o radu, jak na to?

zatomik
Člen | 19
+
0
-

Myslím, že Nette databáze žádnou metodu pro between nemá. Pokud se nepletu, tak stejný účinek by měl dotaz:

WHERE id_kategorie > 1 AND id_kategorie < 17

A to již lze udělat pomocí této metody: viz https://doc.nette.org/cs/database

$table->where("field > ?", $val)
xciza
Člen | 194
+
0
-

Tak teď to nechápu už vůbec :) Trochu podrobněji by to nešlo?

zatomik
Člen | 19
+
0
-

Ten tvůj kód by pak vypadal takto:

public function renderDefault() {
        $this->template->polozka = $this->context->createPolozka()
                ->order('ID_kategorie ASC')->where("ID_kategorie > ?", 1)->where("ID_kategorie < ?", 17);
    }

Ovšem moc nerozumím tomu $this->context->createPolozka(), spíše by jsi měl volat ty metody nad databází:

public function renderDefault() {
        $this->template->polozky= $this->database
                ->order('ID_kategorie ASC')->where("ID_kategorie > ?", 1)->where("ID_kategorie < ?", 17);
    }

Pokud nevíš, kde získat $this->database, tak se mrkni sem: https://doc.nette.org/cs/database (hned nahoře)

A potom někde v šabloně:

{foreach $polozky as $polozka}
neco...
{/foreach}
Ot@s
Backer | 476
+
0
-

Podrobněji to najdeš právě v té dokumentaci
Za předpokladu, že $this->context->createPolozka() vrací Nette\Database\Table\Selection, platí níže uvedené:

$val1 = 10; $val2 = 1000;
$this->template->polozka = $this->context->createPolozka()->where("ID_kategorie > ? AND ID_kategorie < ?", $val1, $val2)->order('ID_kategorie ASC');
Melmen
Člen | 132
+
0
-

Možná něco takovýho? S Nette\Database nedělám, ale mělo by to jít :)

public function renderDefault() {
        $this->template->polozka = $this->context->createPolozka()
		->where('ID_kategorie > 1')
		->where('ID_kategorie < 1')
                ->order('ID_kategorie ASC');
    }

Možná spíš ->where('ID_kategorie > ?', 1)->where('ID_kategorie < ?', 17) :)

//EDIT byl jsem moc pomalej :D

Editoval Melmen (16. 3. 2012 13:37)