Viacero prístupov k databáze z toho istého presentera
- pseudonym
- Člen | 57
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
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
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
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}