Vo výpise noviniek zobraziť meno autora (prepojenie tabuliek news – users)
- NiNu
- Člen | 31
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
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)
- NiNu
- Člen | 31
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
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
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
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)