Přidání vnořeného pole k výsledku dotazu
- jandik.n
- Člen | 41
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
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
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
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.