Vo výpise noviniek zobraziť meno autora (prepojenie tabuliek news – users)

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

Zdravím,
ako začiatočník s Nette by som potreboval poradiť. Spravil som si všetky dostupné návody a teraz skúšam robiť s Nette sám. Mám nasledovný problém:
V administračnej časti mám tabuľku do ktorej chcem vypísať všetky novinky – mysql tabuľka (aj s cudzím kľúčom) pre novinky vyzerá nasledovne: News

Tu je k tomu môj NewsRepository a NewsPresenter a samozrejme latte šablóna do ktorej posielam údaje default.latte

Toto všetko funguje OK, avšak ja by som potreboval, aby sa mi v šablóne namiesto id autora zobrazovali ich používateľské mená, čiže namiesto :

<td>{$news->author}</td>

aby som mohol použiť toto:

<td>{$news->users->usename}</td>

Niečo podobné bolo aj quickstarte, avšak nedarí sa mi to spraviť. Viem, že by som mal použiť related, ale neviem to správne použiť, vždy mi to hádzalo chyby. Predpokladám, že aj mysql tabuľka bude zle navrhnutá, ale potreboval by som širšie vysvetliť ako, načo a kedy sa používa related.

Druhá vec, ktorá mi nie je celkom jasná je ActiveRows, bolo to tiež v quickstarte, ale aj toto by som potreboval trocha širšie vysvetliť ako a kedy je to dobré použiť.

Ďakujem veľmi pekne za Váš čas.

David Matějka
Moderator | 6445
+
0
-

pro „to one“ je klicovy nazev sloupecku, nikoliv cilove tabulky (to je klicove pro related)
pokud se tedy sloupecek jmenuje author_id, pouzij:

$news->author->username

Editoval matej21 (14. 11. 2013 14:39)

vvoody
Člen | 910
+
0
-

Ak nemáš tušenia ako funguje defaultná database Reflection (DiscoveredReflection) tak na pristupovanie do iných tabuliek používaj funkcie ref a related. Malo by fungovať nasledovné.

$news->ref('users','author')->username;
NiNu
Člen | 31
+
0
-

OK, upravil som mysql tabuľku takto → News – ciže author som prepísal na users_id a v šablóne som použil:

<td>{$news->users->username}</td>

a teraz to už funguje, čiže bez toho aby som použil niekde related. Ja som si do teraz myslel, že práve related robí to prepojenie tabuliek.

Vedeli by ste mi vysvetliť, najlepšie na príklade, kedy a ako je dobré použiť related?

Druhá vec je ActiveRows, tie sú na čo a tiež kedy ich použiť?

romiix.org
Člen | 343
+
0
-

Related ti asi lepšie ako je to v dokumentácií nevysvetlí nikto. Používa sa v prípade ak na riadok (jeho ID) odkazuje nejaká iná tabuľka.

ActiveRow je objekt ktorý okrem iného poskytuje záznami konkrétneho riadku. Otázku si položil veľmi všeobecne – neviem na čo konkrétne sa pýtaš.

NiNu
Člen | 31
+
0
-

Dobre, takže mi neostáva nič iné ako sa na related spýtať pri konkrétnom príklade keď v budúcnosti nastane a nebudem to vedieť vyriešiť.

No a čo sa týka toho ActiveRow, ja som čítal čo to je, len mi nie je jasné kedy ho použiť (v akých situáciách).
Ono mi to vytiahne konkrétny riadok z DB, ale predsa to isté spraví aj

$this->database->table('example')->where('id = ?', $id);

Preto sa pýtam aké sú výhody ActiveRow a kedy to použiť. A hlavne mi nie je celkom jasné ako presne sa používa ActiveRow.

romiix.org
Člen | 343
+
0
-

Ešte raz:

Metódu related() použiješ v prípade ak chceš prechádzať záznami ktoré odkazujú na konkrétny riadok. Napríklad máš tabuľku s knihami „book“, tabuľku s výpožičkami „borrow“ a tabuľku „user“ s údajmi o používateľoch.

Štruktúra bude nasledovná:

book
- id
- name

borrow
- id
- user_id // Cudzí kľúč na používateľa ktorý si knihu požičal
- book_id // Cudzí kľúč na knihu ktorá bola vypožičaná
- date

user
- id
- name

Ak budeš chcieť vypísať všetky knihy aj so zoznamom výpožičiek, bude to vyzerať nasledovne:

foreach ($connection->table("book") as $book) {
	echo "Názov knihy: ".$book->name;
	foreach ($book->related("borrow") as $borrow) { // získaš riadky odkazujúce na tú konkrétnu knihu
		echo "Knihu si ".$borrow->date." vypožičal ".$borrow->user->name;
	}
}

K ďalšej otázke okolo ActiveRow.

$sql = $this->database->table('example')->where('id = ?', $id); // vracia Nette\Database\Table\Selection

Premenná $sql bude obsahovať objekt Nette\Database\Table\Selection. Zatiaľ sa dotaz do DB iba skladá.

$row = $this->database->table('example')->where('id = ?', $id)->fetch(); // vracia Nette\Database\Table\ActiveRow

// alebo

foreach ($this->database->table('example')->where('id = ?', $id) as $row) {
	$row; // obsahuje Nette\Database\Table\ActiveRow
}

Premenná $row bude obsahovať objekt Nette\Database\Table\ActiveRow.

Tam nie sú žiadne výhody/nevýhody použitia ActiveRow, proste ho vždy používaš iba o ňom nevieš.

Skutočne by si si mal prejsť dokumentáciu k Nette\Database.

Editoval romiix.org (14. 11. 2013 17:24)

NiNu
Člen | 31
+
0
-

OK, je mi to jasnejšie. Dokumentáciu mám samozrejme vždy otvorenú, len mi to niekedy nepomáha.
Diky moc