Přidání vnořeného pole k výsledku dotazu

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

Ahoj,

mám tabulku Project, která obsahuje sloupec Customer_id. Podle tohoto ID bych chtěl vzít všechny informace o daném zákazníkovi z tabulky Customer a vložit je jako vnořené pole do pole záznamu s Projektem.

Výsledek by mohl vypadat asi takto:

array(Projekt) {
	projekt_id,
	nazev,
	datum_zalozeni,
	...
	...
	array(Zakaznik) {  //vnořené pole s údaji o zákazníkovi projektu
		jmeno,
		prijmeni,
		adresa,
		...
		...
	}

}

Potřebuji to z Modelu celé vrátit v proměnné přes Presenter do Template a zde si to ve vnořeném cyklu vše vypsat – všechny projekty s detaily daného zákazníka. Pokud se to takto nedělá, prosím o radu, jak to správně vyřešit.

Používám Nette\Database.

Snad je můj dotaz srozumitelný. Díky moc za radu!

Editoval jandik.n (13. 3. 2014 23:49)

David Matějka
Moderator | 6445
+
0
-

kdyz vybiras pomoci NDBT („table“), tak ti to vrati ActiveRow pro kazdy projekt. na nem muzes zavolat ->customer a to ti podle ciziho klice vrati zakaznika.

$projects = $database->table('project'); //->where, order apod...
...
foreach($projects as $project) {
	echo $project->customer->name;
}

Pokud opravdu potrebujes pole, tak si ho v modelu sestav

vice v EN dokumentaci pro NDBT obecne, selection, a active row

Mysteria
Člen | 797
+
0
-

Přímo jako pole bych to nevracel, přijdeš tím o výhody NDBT, osobně bych to řešil nějak takto:

Model:

public function getProjects() {
	return $this->database->table('project');
}

Presenter:

public function renderProjects() {
	$this->template->projects = $this->model->getProjects();
}

Šablona:

{foreach $projects as $project}
	Projekt: {$project->nazev}
	Zadavatel: {$project->costumer->jmeno} {$project->costumer->prijmeni}
	...
{/foreach}
nanuqcz
Člen | 822
+
0
-

Ahoj,
v čistém Nette\Database tohle neuděláš. Můžeš použít nějaké rozšíření nad ním, např. fabik/database, anebo si vyber z dalších dostupných.

V čistém Nette\Database jsem vždycky podobné problémy trochu obcházel:

{* Šablona *}
<h1>{$projekt->nazev}</h1>
{var $zakaznik = $presenter->getZakaznikByProjekt($projekt)}
Zákazník: {$zakaznik->jmeno} {$zakaznik->prijmeni}
/* Presenter */
function getZakaznikByProjekt(ActiveRow $projekt) {
	return $this->zakaznikModel->getByProjekt($projekt);
}
/* Model */
function getByProjekt(ActiveRow $projekt) {
	return $projekt->customer;
}

Je to jediný mě známý způsob, jak při použití čistého Nette\Database v některých případech (např tahání dat N:M) udržet jednotlivé části MVC oddělené.


P.S. V tvojem případě bude ale nejjednodušší použít v šabloně prostě toto:

{* Šablona *}
<h1>{$projekt->nazev}</h1>
Zákazník: {$projekt->customer->jmeno} {$projekt->customer->prijmeni}

a díky zápisu ->customer-> si Nette\Database vytáhne data přes cizí klíč customer_id sama.

jandik.n
Člen | 41
+
0
-

Díky moc všem za odpovědi, netušil jsem, že jde takto jednoduše a elegantně k datům přistoupit přímo v Template, myslel jsem, že to musím vše zvlášť načíst. Funguje to parádně, díky moc!