kumuovani podminek pri vice SQL dotaze po sobe

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

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
+
0
-

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).

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)

krcmar
Člen | 17
+
0
-

dekuju za radu jdu to hned zkusit

nanuqcz
Člen | 822
+
0
-

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
+
0
-

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

nanuqcz
Člen | 822
+
0
-

jen pro upřesnění (možná už to víš): $this->getService('database') je to samé jako $this->context->database. Aby tě to pak nemátlo, až to budeš překopávat :-)

krcmar
Člen | 17
+
0
-

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
+
0
-

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)

krcmar
Člen | 17
+
0
-

pravda, to me nenapadlo, kazdopadne dekuji za cenne rady

at te tva sila provazi dal … :)