Náhradný názov pre stĺpec/tabuľku v MySQL
Na záver tohto semestra si aspoň na posledných dvoch prednáškach aj troška zaprogramujeme a aplikujeme niečo do našej stránky z toho, čo sme si preberali na predchádzajúcich. Skúsime si teda načítavanie telefónnych čísel a ich priradenie do objektu User, ktoré sme si popisovali. Našim cieľom je teda mať objekt User, ktorý bude obsahovať všetky telefónne čísla daného usera, ktoré máme uložené v tabuľke user_phone_numbers. Okrem toho si musíme načítať aj prioritné telefónne číslo, ktoré zobrazíme do tabuľky v novom stĺpci.
Začnime teda načítaním hlavného telefónneho čísla. Ako vieme, tento údaj máme uložený v tabuľke users, kde sa cez toto id číslo musíme nalepiť na tabuľku user_phone_numbers a vytiahnuť hodnotu tohto čísla (LEFT JOIN s podmienkou podľa čísla). Keďže sme začali s OOP, bude to ako nová property, ktorú si následne zobrazíme v tabuľke na domovskej stránke. Musíme zabezpečiť, aby sa nám do tejto property uložila hodnota z dát z databázy (cez konštruktor) a takisto, aby sa zobrazila v príslušnom stĺpci v tabuľke. Mohli by ste to zvládnuť aj sami, mohlo by to vyzerať asi takto:
index.php (pridaný/zmenený kód na viacerých miestach:
…
(zmenená funkcia loadData v triede UserList)
function loadData($db_connection){
$sql_query = "SELECT users.id,users.user_name,users.user_surname,users.age,users.role,user_phone_numbers.phone_number FROM users LEFT JOIN user_phone_numbers ON users.main_phone_number_id=user_phone_numbers.id";
…
(pridaný ďalší údaj na preposlanie do konštruktora)
//TRANSFORMACIA DAT NA POLE OBJEKTOV
foreach($data as $key => $value){
if($value['role'] == 'owner'){
$this->users[$key] = new UserOwner($value['id'], $value['user_name'], $value['user_surname'], $value['age'], $value['role'], $value['phone_number']);
}else{
$this->users[$key] = new User($value['id'], $value['user_name'], $value['user_surname'], $value['age'], $value['role'], $value['phone_number']);
}
}
…
(nová property v triede User)
public $role = '';
public $main_phone_number = '';
function __construct($id, $user_name, $user_surname, $age, $role, $main_phone_number){
$this->id = $id;
$this->user_name = $user_name;
$this->user_surname = $user_surname;
$this->age = $age;
$this->role = $role;
$this->main_phone_number = $main_phone_number;
}
…
(pridaný stĺpec v tabuľke)
echo '<th>Vek</th>';
echo '<th>Rola</th>';
echo '<th>Telefón</th>';
echo '<th>Akcie</th>';
Ako vidíte v ukážke kódu, zabezpečili sme, aby sa do novej property v triede User ukladal správny údaj (phone_number) cez konštruktor, ktorý sa do neho posiela pri prechádzaní dát z databázy (tam, kde vytvárame objekty). Na začiatku sme náš select zmenili tak, že sme museli vymenovať stĺpce cez názov tabuliek a pridali sme JOIN na prepojenie medzi idčkom hlavného čísla z tabuľky users a načítaním príslušného čísla z tabuľky user_phone_numbers podľa id. Na konci sme iba pridali novú bunku do hlavičky (th), takže po spustení by sa malo číslo pekne zobrazovať v tabuľke.
Prvú úlohu máme úspešne za sebou (zobrazenie aspoň jedného – hlavného čísla v tabuľke). Poďme teraz naprogramovať načítanie všetkých čísiel daného používateľa, ktoré sa uložia do ďalšej property (pole čísel). Ako sme si povedali, musíme použiť JOIN na select, ktorým sme si vytiahli aspoň jedno číslo a následne počet čísel, ktoré sa spoja príkazom group by. Tieto údaje budeme potrebovať na to, aby sme vedeli, pri ktorom používateľovi načítať aj ostatné čísla (podľa kombinácie hodnôt phone_number a count(*)). Vyskúšame si najprv zložiť tento SELECT a dáme si vypísať výsledok db cez helper, aby sme videli, či to vyzerá tak, ako chceme.
Tu narážame ale na jeden problém. V našom SELECTe sme už použili jeden JOIN na tabuľku user_phone_numbers a okrem toho z nej už raz vyťahujeme stĺpec s názvom phone_number. My potrebujeme k tomuto SELECTu pridať ešte jeden JOIN (ten istý, ako sme si ho ukázali skorej v kapitole o JOINe) na tú istú tabuľku. Ak si spomínate, keď sme JOIN robili prvýkrát, tak sme museli názvy stĺpcov pomenovať aj cez názov tabuľky, pretože sme mali stĺpce s rovnakým názvom (id). Na ten prípad to stačilo. Čo ale spravíme teraz, keď už stĺpce máme pomenované cez názov tabuľky a potrebujeme spraviť ešte jeden JOIN na tú istú tabuľku? Ako to pomenovať teraz, aby to bolo iné?
Aj na tento prípad slúži príkaz AS (ako – pomenuj ako) v jazyku SQL, ktorý slúži na zadanie aliasu (náhradné meno). Tento príkaz môžeme použiť za hocijakým stĺpcom alebo názvom tabuľky. Funguje to tak, že po zadaní tohto príkazu zadáme iné meno, ktoré budeme používať či už pre stĺpec alebo pre tabuľku. Tento príkaz musíme použiť v našom prípade, pretože potrebujeme alias aj pre tabuľku (aby nebol dvakrát ten istý názov) a takisto pre stĺpec phone_number. Asi si to neviete predstaviť, pozrime sa rovno na našu upravenú SQL query a potom si to vysvetlíme:
index.php:
SELECT users.id,users.user_name,users.user_surname,users.age,users.role,user_phone_numbers.phone_number,upn.phone_number AS phone_number_2,COUNT(*) FROM users
LEFT JOIN user_phone_numbers ON users.main_phone_number_id=user_phone_numbers.id
LEFT JOIN user_phone_numbers AS upn ON users.id=upn.id_user GROUP BY users.id
Všimnite si, že k predcházdajúcemu select príkazu sme pridali druhý JOIN (ten, čo sme už raz robili), kde sme za názvom tabuľky pridali príkaz AS (alias) a tabuľku v tomto prepojení sme si nazvali ako upn. Za príkazom SELECT vymenúvame všetky stĺpce, ktoré chceme ťahať. K údajom z posledného selectu sme pridali vytiahnutie aj jedného čísla z upn (upn.phone_number) a potom count, ako sme ho použili aj predtým. Ak sa pozriete na výsledok tejto query, uvidíte, že výsledok vyzerá takisto ako predtým, len máme zobrazené dva stĺpce navyše. Jeden hovorí o jednom čísle z tabuľky pri GROUP BY a druhý počet záznamov, ktoré sa zgrupli (tak ako predtým).
Všimnite si, že stĺpec sa volá vo výsledku presne tak, ako sme si ho nazvali (phone_number_2). Keď už máme všetky údaje, ktoré potrebujeme, teraz už budeme vedieť, pri ktorom používateľovi budeme musieť načítavať ostatné čísla. V poslednej kapitole tohto semestra si teda dokončíme kompletné načítavanie týchto čísiel a taktiež si ukážeme, ako vieme nejaký element jazyka HTML skrývať a zobrazovať pomocou JavaScriptu.
Na záver ešte jedno upozornenie, keďže sme do selectu v predchádzajúcej prednáške pridali GROUP BY, musíme zmeniť podmienku, pretože nám nebude fungovať filtrovanie. Príkaz GROUP BY musí byť totižto za príkazom WHERE, takže nemôžeme group by zadať priamo za selectom (ako sme to urobili v poslednej prednáške rovno do SELECTu), ale až za podmienku, kde sa lepí podmienka where do selectu. Okrem toho je dobré pridať názov tabuľky pri stĺpcoch v podmienke WHERE. Kód by mal teda vyzerať takto:
index.php:
...
function loadData($db_connection){
$sql_query = "SELECT users.id,users.user_name,users.user_surname,users.age,users.role,user_phone_numbers.phone_number,upn.phone_number AS phone_number_2,COUNT(*) FROM users LEFT JOIN user_phone_numbers ON users.main_phone_number_id=user_phone_numbers.id LEFT JOIN user_phone_numbers AS upn ON users.id=upn.id_user";
if($this->search_keyword){
$sql_query .= " WHERE users.user_name LIKE '%".$this->search_keyword."%' OR users.user_surname LIKE '%".$this->search_keyword."%'";
}
$sql_query .= " GROUP BY users.id";
if($this->sort_by){
...