Nette\Database fetch na joinutych tabulkach pre nastavenie defaultnych hodnot formulara

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

Ahojte, pouzivam najnovsie Nette a po dlhej dobe som sa odhodlal prejst z Dibi na Nette\Database a hned som narazil na problem ktory som v dibi rutinne riesil cez fetch ale v v Database sa mi to nedari.

Potrebujem urobit query ktory mi z dvoch prepojenych tabuliek jeden objekt alebo pole ktore by som mohol pouzit pre nacitanie hodnot do formulara bez toho aby som to musel foreachovat. Uz som skusal rozne sialene kombinacie ako vyskladat query, ale vzdy ked som spojil tabulky a poslal som to na funkciu <?php iterator_to_array(); ?> vratilo mi len stlpca z druhej tabulky.

Mate nejaky best practice ktory sa da pri Nette\Database pouzit na nastavenie hodnot formualara?

Editoval ony2 (19. 1. 2012 20:05)

rixi
Člen | 109
+
0
-

priklad:

$form->addSelect('category_id', null, $this->database->table('categories')->fetchPairs('id', 'name'))
	->setPrompt('Kategória ..');
ony2
Člen | 9
+
0
-

Ja som nemyslel ako naplnit select z jednej tabulky, to je jednoduche, ale ako vybrat jeden riadok z viacerych tabuliek cez inner alebo left join a pouzit ich ako data pre cely formular.
V dibi to je jednoduche:

<?php
if (!$form->isSubmitted()) {
  $res = dibi::query('SELECT * FROM page INNER JOIN page_type ON page_type.id = page.page_type_id');
  $row = $res->fetch();
  if (!$row) {
    throw new \Nette\Application\BadRequestException('Record not found');
  }
  $form->setDefaults($row);
}
?>

Ale v Nette\Database to neviem.

rixi
Člen | 109
+
0
-

vztah 1:1, ak 1:N treba cez metodu related()

$a = $this->database->table('page')->get($id); // vrati row z tabulky page
$b = $a->page_type; // vrati row z tabulky page_type

malo by to byt takto, dufam ze som dobre pochopil :)

Editoval rixi (20. 1. 2012 9:13)

ony2
Člen | 9
+
0
-

Aha, takze nedokazem to vytiahnut na jedenkrat do jedneho pola, kde by som mal data z oboch tabuliek?

Lebo ten moj priklad s dibi mi vrati jeden pekny dibiRow kde mam vsetky stlpce ktore potrebujem.

Ak taketo nieco nette database nedokaze tak to je dost smutne

22
Člen | 1478
+
0
-

teda database nepoužívám, ale asi chceš:
Pokud použijeme tečkovou notaci (‚$table.$column‘), automaticky se vytvoří spojení s odkazovanou tabulkou.API

Nebo chceš něco jiného, než join 2 tabulek a vypsání výsledku?

Editoval 22 (22. 1. 2012 0:46)

rixi
Člen | 109
+
0
-

ony2 wrote:

Aha, takze nedokazem to vytiahnut na jedenkrat do jedneho pola, kde by som mal data z oboch tabuliek?

Lebo ten moj priklad s dibi mi vrati jeden pekny dibiRow kde mam vsetky stlpce ktore potrebujem.

Ak taketo nieco nette database nedokaze tak to je dost smutne

Samozrejme ze to ide aj s Nette\Database, ako pise 22. Pomocou tejto syntaxe by sa malo dat vyselectovat vsetko co potrebujes a z x tabuliek, ak sa uspesne vykona automaticky JOIN.

 // select vsetkych stlpcov z dvoch tabuliek
$this->database->table('page')
	->select('page.*, page_type.*')
	->where('page.id', $id);

Editoval rixi (22. 1. 2012 9:57)

ony2
Člen | 9
+
0
-

To je jebáá, ono to automaticky urobilo join, a to som si myslel ze NATURAL JOIN v postgresql je aky pokrokovy :)

Diki chlapi za pomoc.