v latte nejde spravne where

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

v latte potrebuju zpristupnit data z databaze, do template si poslu 2 cely tabulky a pak znich chcu vykreslit tabulku

{foreach $pozadavky as $pozadavek}


	<th class="typ">{$pozadavek->typ}</th>
	<th class="nemovitost">{$pozadavek->nemovitost->nazev}</th>

 	{foreach $users->where("id = '$pozadavek->vzneslKlientId'") as $klient}
		</tr><th class="klient">{$klient->jmeno}</th>
	{/foreach}

	{foreach $users->where("id = '$pozadavek->zpracovavaZamLogin'") as $klient}
		<th class="klient">{$klient->jmeno}</th>
	{/foreach}

{/foreach}

a problem je vtom ze pri první volani where se provede jedna podminka „WHERE (id = ‚3‘)“ jak má, ale dalsi „WHERE (id = ‚3‘) AND (id = ‚9‘)“ uz si nabaluje podminky ste predesle.

romiix.org
Člen | 343
+
0
-
  1. Toto je správanie Nette\Database – nemá to nič s latte.
  2. Podmienku $users->where("id = '$pozadavek->vzneslKlientId'") sa dá zapísať ako $users->where("id",$pozadavek->vzneslKlientId).
  3. Toto nie je chyba ale vlastnosť:)

Ak to takto chceš použiť malo by to vyzerať nasledovne:

{foreach $pozadavky as $pozadavek}
    <th class="typ">{$pozadavek->typ}</th>
    <th class="nemovitost">{$pozadavek->nemovitost->nazev}</th>
    {var $users2 = clone $users}
    {foreach $users->where("id = '$pozadavek->vzneslKlientId'") as $klient}
        </tr><th class="klient">{$klient->jmeno}</th>
    {/foreach}

    {foreach $users2->where("id = '$pozadavek->zpracovavaZamLogin'") as $klient}
        <th class="klient">{$klient->jmeno}</th>
    {/foreach}
{/foreach}

4. Predpokladám, že sa snažíš vypísať jmeno používateľov v tabuľke user prepojených cez stĺpce vzneslKlientId a vzneslKlientId prepojené cudzími kľúčmi cez AcriveRow $pozadavek

V tom prípade by to mohlo vyzerať nasledovne:

{foreach $pozadavky as $pozadavek}
    <th class="typ">{$pozadavek->typ}</th>
    <th class="nemovitost">{$pozadavek->nemovitost->nazev}</th>
    {foreach $pozadavek->related('user','vzneslKlientId') as $klient}
        </tr><th class="klient">{$klient->jmeno}</th>
    {/foreach}
    {foreach $pozadavek->related('user','zpracovavaZamLogin') as $klient}
        <th class="klient">{$klient->jmeno}</th>
    {/foreach}
{/foreach}

5. Predpokladám, že </tr> je tam omylom.

6. Prepísané do n:foreach

{foreach $pozadavky as $pozadavek}
    <th class="typ">{$pozadavek->typ}</th>
    <th class="nemovitost">{$pozadavek->nemovitost->nazev}</th>
    <th n:foreach="$pozadavek->related('user','vzneslKlientId') as $klient" class="klient">{$klient->jmeno}</th>
    <th n:foreach="$pozadavek->related('user','zpracovavaZamLogin') as $klient" class="klient">{$klient->jmeno}</th>
{/foreach}

Opravené ref na related.

Editoval romiix.org (31. 10. 2013 23:23)

eis
Člen | 3
+
0
-

jo mas naprostou pravdu presne to potrebuju :) a moc diky!!

ta prvni varianta mi uz dela presne co potrebuju ale ta druha ktera vypada lip a prehlednej, vraci do $klient jen cislo ktery je v tom sloupci ulozeny a ne objekt databaze user.

tak nevim jestli jeste neco delam spatne

David Matějka
Moderator | 6445
+
0
-

trochu opravim romiix.org:
nikoliv ref, ale related, ref je pro to one, related pro to many.. pouziti ale bude stejne.

a k bodu 2 od romiix.org: ne, ze se to takhle da zapsat, takhle to zapisuj vzdycky, jinak buh bude zabijet kotatka!

romiix.org
Člen | 343
+
0
-

matej21: Vďaka za opravu, preklep. Opravil som predošlí príspevok aby bol správne.

Editoval romiix.org (31. 10. 2013 23:24)

eis
Člen | 3
+
0
-

kdyz to ted pouziju tak mi to vytvori spatny sql dotaz. Nevim jestli mam teda spatne definovany sql tabulky nebo co je spatne.

CREATE TABLE pozadavek (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  vzneslKlientId int(10) unsigned NOT NULL,
  zpracovavaZamLogin int(10) unsigned  ,
  KEY fk_vzneslKlientId (vzneslKlientId),
  KEY fk_login (zpracovavaZamLogin),
  PRIMARY KEY (id),
  CONSTRAINT fk_vzneslKlientId FOREIGN KEY (vzneslKlientId) REFERENCES user (id),
  CONSTRAINT fk_login FOREIGN KEY (zpracovavaZamLogin) REFERENCES user (id)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE user (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  username varchar(50) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY username (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

*tabulky jsou osekany o zbytecny sloupce

a kdyz pouziju

<th n:foreach="$pozadavek->related('user','vzneslKlientId') as $klient" class="klient">{$klient->jmeno}</th>

tak to vytvori sql dotaz

SELECT *
FROM `user`
WHERE (`user`.`vzneslKlientId` IN (1, 2, 3, 4, 5, 7, 9))

kterej je samozrejme spatne, protoze sloupec vzneslKlientId existuje jen v tabulce pozadavek.

jsvelta
Člen | 39
+
0
-

V tomto prípade by si tam mal mať asi niečo takéto:
$pozadavek->vzneslKlient->jmeno

Ide o vazbu N:1 a nie 1:N

Ten foreach by bol z opacnej strany, ak by si chcel pozadavky klienta.

romiix.org
Člen | 343
+
0
-

Tak teda som mal asi správne ten prvý zdroják, ktorý som potom opravil na zlý.

Skús použiť:

{foreach $pozadavky as $pozadavek}
    <th class="typ">{$pozadavek->typ}</th>
    <th class="nemovitost">{$pozadavek->nemovitost->nazev}</th>
    <th class="klient">{$pozadavek->ref('user','vzneslKlientId')->jmeno}</th>
    <th class="klient">{$pozadavek->ref('user','zpracovavaZamLogin')->jmeno}</th>
{/foreach}