kumuovani podminek pri vice SQL dotaze po sobe
- krcmar
- Člen | 17
ahoj, asi zakladni neznalost, ale nemohu to rozlousknout …
vychazim ze sandboxu verze Nette Framework 2.0-beta ze dne 28. 05. 2011
pridano pouze pripojeni na mysql DB
<?php
database:
class: Nette\Database\Connection
arguments: ['mysql:host=localhost;dbname=krcma', 'root', 'pass']
?>
tabulka jazyky obsahuje pouze pole id – int a nazev – varchar
a do renderDefault homepage presenteru tento kod:
<?php
$par_row = array('nazev' => 'CZ_naz');
$this->jazyky->find('cz')->update($par_row);
$par_row = array('nazev' => 'RU_naz');
$this->jazyky->find('ru')->update($par_row);
?>
provedou se tyto 2 dotazy:
<?php
UPDATE `jazyky`
SET `nazev`='CZ_naz'
WHERE (`id` = 'cz')
UPDATE `jazyky`
SET `nazev`='RU_naz'
WHERE (`id` = 'cz') AND (`id` = 'ru')
?>
nevim proc se ve druhem dotazu pamatuje ta podminka id = cz
asi mi neco zasadniho unika ?
diky TH
Editoval krcmar (25. 7. 2011 10:32)
- nanuqcz
- Člen | 822
Nette\Database\Table\Selection
(což je tvůj $this->jazyky)
funguje tak, že si pamatuje všechno, co do něho dáš (takové ty věci jako
where, order by apod.), dokud se po něm nepožadují data (v metodách
z interface Traversable
).
V API
by bodlo něco jako metoda reset
, bohužel nic takového jsem tam
nenašel. Budeš muset asi objekt jazyky
vytvořit znova.
$this->jazyky = $this->database->table('jazyky');
$par_row = array('nazev' => 'CZ_naz');
$this->jazyky->find('cz')->update($par_row);
$this->jazyky = $this->database->table('jazyky'); //vytvoříme znova, abychom smazali předchozí find('cz')
$par_row = array('nazev' => 'RU_naz');
$this->jazyky->find('ru')->update($par_row);
Netestováno, ale mělo by to jet.
Editoval xxxObiWan (25. 7. 2011 11:41)
- nanuqcz
- Člen | 822
Ono by vůbec asi bylo lepší, kdybys proměnnou
$this->jazyky
vůbec neměl, a používal jen
$this->context->database
. Je to sice o trochu delší, ale
zato čistší a v původním duchu používání Nette\Database :-)
$par_row = array('nazev' => 'CZ_naz');
$this->context->database->table('jazyky')->find('cz')->update($par_row);
$par_row = array('nazev' => 'RU_naz');
$this->context->database->table('jazyky')->find('ru')->update($par_row);
- krcmar
- Člen | 17
ja jeste zapomel dodat, ze mam ve startup() presenteru
konstrukci
$this->jazyky = $this->getService(‚model‘)->getJazyky();
pricemz $jazyky je privatni promenna, vzal jsem to jak je to delane v prikladu cd-collections s tema albums
jenze tam se album pouzije vzdy jednou a ja mam takovy ten formular, s X radkama a co uzivatel zmeni tak na to chci pustit UPDATE a narazil jsem na to ze se mi kumuluji ty WHERE podminky
musim si nacict co dela ta service a jak to zkombinovat s tim tvym $this->context->database
- krcmar
- Člen | 17
xxxObiWan napsal(a):
jen pro upřesnění (možná už to víš):
$this->getService('database')
je to samé jako `$this->context-
mno presne to jsem hledal ! dik
jinak to slape, ale s tim ze nemuzu pouzit tu privatni promenou, a vsude
volat dlouze ten context
chtelo by to ten reset jak jsi rikal !!!
ale coz, hlavne ze to slape
jenom me napada, jaky smysl ma to kumulovani tech podminek, je to k necemu
jinak moc dekuji za pomoc
- nanuqcz
- Člen | 822
Jj, je to k něčemu
$articles = $database->table('articles');
$articles->where("active=1");
if ($filter !== NULL) {
$articles->where($filter); //podmínky se spojí přes AND
}
if ($order_by !== NULL) {
$articles->orderBy($order_by);
}
foreach($articles as $article){
echo "<h2>$article->title</h2>";
...
}
Editoval xxxObiWan (25. 7. 2011 16:19)