CakePHP – afterFind()

Ravno v neki zadevi ki jo delam sem imel primer kjer sem moral dobiti iz baze nek podatek združen iz dveh polj. Kako to storiti brez da bi uporabil svoj SQL stavek in pa CONCAT ipd. kar bi ga seveda lahko ampak zakaj bi če imamo za to funkcijo ki nam naredi z podatki kar želimo.

Funkcija afterFind() nam omogoči da z podatki ki jih dobimo iz baze naredimo kar hočemo, še predno podatki pridejo v view (template).

Recimo en primer. Rabim dobiti v select box (generateList() funkcija) podatek mesta in pa poštne številke kot value in kot key imam seveda id mesta….

  1. span style="color: #ff0000;">'Citys''Citys']['NameAndPostalCode'] = $val['Citys']['name'].' ('.$val['Citys']['postal_code'].')'

Kaj se tukaj zgodi ? V funkcijo afterFind($results) dobimo array $results ki drži dobljene podatke iz baze. Skozi te podatke gremo s foreach() stavkom. Kot lahko opazite sem iz $val[‘Citys’][‘name’].’ (‘.$val[‘Citys’][‘postal_code’].’)’ dobil $results[$key][‘Citys’][‘NameAndPostalCode’] ki ga bom nato klical kjerkoli bom pač rabil podatke za mesta. Recimo ta podatek bom uporabi l(kot sem že omenil) v select boxu z funkcijo generateList().
  1. $this->set('Citys''lang' => $this->Session->read('lang'),
  2. 'domain' => $this->Session->read('domain''{n}.Citys.city_id', '{n}.Citys.NameAndPostalCode'
  3. )
  4. );

Tako. Sedaj bom imel v select box-u Mesto (Poštna št.)…

Zadeva je dokaj uporabna in pisanja svojega SQL stavka zato bi bilo nesmiselno. Zakaj ? Zato ker bi ga moral pisati na večih mestih in iz tega potem pride zmeda. Tukaj naredim to na enem mestu in imam povsod iste podatke.

Seveda v tej funkciji lahko naredimo poljubno z podatki…

Upam da pride kakšnemu peku prav 🙂

Blaz

Blaz wrote 49 posts

Post navigation


Dodaj odgovor

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Time limit is exhausted. Please reload CAPTCHA.