Viacero prístupov k databáze z toho istého presentera

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

Dobrý deň,
potreboval by som z jedného presentera viackrát pristúpiť k databáze, ale stále vypísať niečo iné.

Mám tabuľku apartment, k nej budem neskôr pripájať iné a budem vypisovať informácie aj z iných tabuliek (to zatiaľ nie je podstatné). Tabuľka apartment má stĺpce floorNumber (poschodie) a coordinates (pre vykreslenie mapy nad obrázkom) a title (titulok). Potrebujem každé poschodie vykresliť nad iným obrázkom ako klikaciu mapu. Nakoniec potrebujem vypísať všetky byty v tabuľke.

V šablone by to malo vyzerať nejako takto (zbytočnosti som vyhodil):

<img src="1.png" alt="" usemap="#first" id="first_map" width="928" height="542" class="map" />
<img src="2.png" alt="" usemap="#second" id="second_map" width="928" height="542" class="map" />
<img src="3.png" alt="" usemap="#third" id="third_map" width="928" height="542" class="map" />

<p>Všetky byty:</p>
<ul>
   <li n:foreach="$all_floor as $apartment">{$apartment->title}</li>
</ul>

<map n:syntax="double" name="first">
   <area n:foreach="$first_floor as $apartment" id="a_{{$apartment->id}}" shape="poly" coords="{{$apartment->coordinates}}" alt="{{$apartment->title}}" />
</map>

<map n:syntax="double" name="second">
   <area n:foreach="$second_floor as $apartment" id="a_{{$apartment->id}}" shape="poly" coords="{{$apartment->coordinates}}" alt="{{$apartment->title}}" />
</map>

<map n:syntax="double" name="third">
   <area n:foreach="$third_floor as $apartment" id="a_{{$apartment->id}}" shape="poly" coords="{{$apartment->coordinates}}" alt="{{$apartment->title}}" />
</map>

Ako to spraviť čo najlepšie? Napr. aby som musel len raz selectovať z databázy a potom to nejako rozlíšiť v Latte? Teraz to mám robené veľmi zle:

public function renderDefault() {
   $this->template->first_floor = $this->context->createApartments()->where("floorNumber", 1);
   $this->template->second_floor = $this->context->createApartments()->where("floorNumber", 2);
   $this->template->third_floor = $this->context->createApartments()->where("floorNumber", 3);
   $this->template->all_floor = $this->context->createApartments()->order("title ASC");
}

Keď som to robil, ešte som nevedel, ako presne sa používa Nette\Database\Table\Selection, teraz by to vyzeralo nejako takto:

$table = $this->db->table('apartment');

$this->template->first_floor = $table->where("floorNumber", 1);
$this->template->second_floor = $table->where("floorNumber", 2);
$this->template->third_floor = $table->where("floorNumber", 3);
$this->template->all_floor = $table->order("title ASC");

Bohužiaľ, zistil som, že takto sa v tom $table skladajú tie where(). Neviem, ako by sa to dalo čo najlepšie vyriešiť. Aby to fungovalo, asi by trebalo zavolať $this->db->table('apartment') pre rôzne premenné. Len chcem vedieť, či to nejde aj lepšie.

Vopred ďakujem za pomoc

Ot@s
Backer | 476
+
0
-

Ohledně tohoto tématu už šla teoretická řeč.

$table = $this->db->table('apartment');
$f1 = clone $table;
$this->template->first_floor = $f1->where("floorNumber", 1);
$f2 = clone $table;
$this->template->second_floor = $f2->where("floorNumber", 2);
// ...
$this->template->all_floor = $table->order("title ASC");
pseudonym
Člen | 57
+
0
-

Super, vďaka. Toto funguje. Ešte sa chcem opýtať, či sa dá nejako spraviť JOIN tabuliek bez toho, aby som vyberal napr. where('table.column', value). Ide totiž o to, že chcem vytiahnuť z databázy všetky informácie z tabuľky apartment, ktorá sa odkazuje na tabuľky apartmentType a apartmentFlag.

Skúšam niečo takéto:

$this->template->apartments = $table->select("idApartment", "description", "title", "floorNumber", "apartmenttype.name", "apartmentflag.name")->order("title ASC");

ale bohužiaľ to nefunguje. Vypíše mi PDOException No reference found for $apartment->title.

Vopred ďakujem za odpovede

EDIT:
Mám tam chybu v tom zápise select(). Správne to má byť len s jednými úvodzovkami takto:

$this->template->apartments = $table->select("idApartment, description, title, floorNumber, apartmenttype.name, apartmentflag.name")->order("title ASC");

Editoval pseudonym (3. 5. 2012 13:03)

vvoody
Člen | 910
+
0
-

V sablone skus

{$apartment->ref('apartmentType')->name}
{$apartment->ref('apartmentFlag')->name}

funkcia ref este bere aj druhy parameter, nazov stlpca z tabulky apartmanov kde mas foreign key na apartmentType/apartmentFlag. Za urcitych okolnosti ten druhy parameter netreba uvadzat, tak potom staci aj len

{$apartment->apartmentType->name}
{$apartment->apartmentFlag->name}