Problém s related výpisem

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

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

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

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.

Šaman
Člen | 2666
+
0
-

Tak jestli to není překlep se závorkama, který máš v příspěvku, tak by to mohlo být databází. Musíš mít definované cizí klíče, nejlépe se ti to bude dělat v Adminerovi.

Donkeykong
Člen | 39
+
0
-

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

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

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

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

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)