Problém s related výpisem
- Donkeykong
- Člen | 39
Zdravím,
mám začátečnický problém s používáním related. Umím třeba vytáhnout obrázek k článku a podobné věci, ale teď potřebuji něco složitějšího a nevím jak dál. Mám dvě tabulky: „car“ a „type“. V tabulce „car“ mám políčka jako id, title, description, type_id. V tabulce „type“ mám políčka id, name. Tabulku „car“ mám naplněnou auty a v tabulce „type“ mám 2 záznamy: prodej, pronájem, které se vážou k políčku name.
V šabloně poté vypisuju všechny auta klasicky:
<?php
{foreach $cars as $car}
{$car->title}
{$car->description}
{/foreach}
?>
Co bych teď chtěl je pod description vypsat ještě jeho „type“, který právě může být buď: prodej nebo pronájem. Byl by mi někdo schopný mi polopaticky vysvětlit jak na to?
Děkuji
Editoval Donkeykong (12. 6. 2013 9:46)
- David Matějka
- Moderator | 6445
v Nette\Database jsou v podstate 2 funkce pro praci s relacemi, related a
ref
related je pro relaci 1:n, tedy kdyz budes chtit pro type vypsat auta,
pouzijes
foreach($type->related('car') as $car)
a ref je pro „druhy smer“, pokud budes chtit vedet typ auta
$car->ref('type')->name
navic tu metodu ref vubec nemusis pouzivat, staci napsat
$car->type->name
nette se pokusi najit sloupecek type a pokud neexistuje, predpoklada, ze se jedna o relaci a vrati stejny vysledek jako ref()
- Donkeykong
- Člen | 39
Ahoj díky.
Udělal jsem tedy:
<?php
{foreach $cars as $car}
{$car->ref('type'}->name}
?>
Ale dostávám teď chybu No reference found for $car->type.
- Donkeykong
- Člen | 39
Stydím se:/ klíče jsem nedefinoval. Je nějaká možnost jak to dělat bez nich? Používal jsem dříve jiný framework a tam definování klíčů pomocí relatinships nebylo nutné.
- David Matějka
- Moderator | 6445
doporucuji pouzit klice, ale muzes i bez nich, k tomu slouzi nastaveni reflection v konfiguraci databaze, viz https://doc.nette.org/cs/configuring#… kdyz pouzijes conventional, neni nutno definovat klice, ale je nutno dodrzovat pravidla (coz v tvem pripade vypada, ze dodrzena jsou) – napr. primarni klic musi byt id, nazev sloupecku odkazujiciho na jinou tabulku musi byt nazev_tabulky_id atd.
- Donkeykong
- Člen | 39
matej21 napsal(a):
doporucuji pouzit klice, ale muzes i bez nich, k tomu slouzi nastaveni reflection v konfiguraci databaze, viz https://doc.nette.org/cs/configuring#… kdyz pouzijes conventional, neni nutno definovat klice, ale je nutno dodrzovat pravidla (coz v tvem pripade vypada, ze dodrzena jsou) – napr. primarni klic musi byt id, nazev sloupecku odkazujiciho na jinou tabulku musi byt nazev_tabulky_id atd.
Skvělé, moc díky. Šlape to :-)
- Donkeykong
- Člen | 39
Tak mám ještě jeden problém s related. Mám kategorie a chci vypisovat auta v jednotlivých kategoriích. Moje tabulka „car“ má teď políčka id, title, description, category_id. Poté mám tabulku category a políčka id, name.
Teď jsem si vytvořil speciální presenter pro kategorie s názvem: CategoryPresenter. V metodě renderDefault mám
<?php
public function renderDefault($id)
{
$this->template->cars = $this->carRepository->findAll();
$this->template->categories = $this->categoryRepository->findAll();
}
?>
A v šabloně:
<?php
{foreach $categories as $category}
{foreach $category->related('car','category_id') as $car}
{$car->title}
{$car->description}
{/foreach}
{/foreach}
?>
Bohužel mi to ale vypisuje úplně všechny auta co jsou v db a ne ty co spadají do dané kategorie. Co dělám špatně? Díky
- Šaman
- Člen | 2666
No, tohle ti přece vypíše pro každou kategorii všechna její auta. Nebo ti to v každé kategorii vypíše všechna, tj. opakují se ti?
Pokud to první, tak si v presenteru načti jen tu kategorii kterou právě
prohlížíš
($this->template->category = $this->categoryRepository->get($id);
)
a v šabloně zruš ten vnější foreach.
Jo a jestli tu proměnnou $cars
, kterou předáváš šabloně,
nepoužíváš někde mimo tento příklad, tak je ten první řádek
v presenteru zbytečný.
Editoval Šaman (12. 6. 2013 22:42)