CodeIgniter : Core model
Krátky tutoriál v ktorom vytvoríme základnú štruktúru core modelu, a možno ostane čas aj na krátku implementáciu....
Pre všetkých určite známy problém, keď vytvárame v modeloch stále tie isté metódy ako:
save(), insert(), update(). a pod.
Čo takto si vytvoriť core model a "nahádzať" všetky metódy, ktoré často opakujeme v modeloch sem? Poďme si teda takýto jednoduchý model vytvoriť.
1. Vytvoríme súbor MY_Model.php
/application/core/MY_Model.php
2. Vytvorenie triedy
class My_Model extends CI_Model {
}
3. Zoznam Metód
Zoznam metód ktoré budeme v triede My_Model vytvárať. Samozrejme toto je základný model, a pre svoje potreby si môžete metódy rozšíriť alebo pridať nové.
class My_Model extends CI_Model {
private $_table;
private $_primary_key='id';
function __construct()
{
parent::__construct();
}
public function setTable($table)
{
}
public function getTable()
{
}
public function setPrimaryKey($key)
{
}
public function getPrimaryKey()
{
}
public function save($data)
{
}
public function update($data)
{
}
public function delete($data)
{
}
public function getTotal($data)
{
}
public function getByPk($data)
{
}
public function getWhere($data)
{
}
private function _checkData($data)
{
}
}
4. Jednotlivé metódy podrobne
- Setter: pre nastavene nazvu tabulky
public function setTable($table) { $this->_table = $table; } - Getter: pre nazov tabulky
public function getTable() { return $this->_table; } - Setter: nastavene primárneho kľúča
public function setPrimaryKey($key) { $this->_primary_key = $key; } - Getter: získanie primárneho kľúča
public function getPrimaryKey() { return $this->_primary_key; } - Save: Túto metódu možeme použiť aj ako update, tým že do poľa $data vložíme hodnotu nášho primary key: napr.
$data = array('id'=>5,'username'=>'jozko')public function save($data=array()) { // ziskame primary key $primary = $this->getPrimaryKey(); // podmienka pre $data if($this->_checkData($data)==FALSE) return false; // podmienka ci $data obsahuje primary_key if(isset($data[$primary]) AND intval($data[$primary]))!=0) { // vykoname UPDATE $id = $data[$primary]; unset($data[$primary]); return $this->update($data,$id); } else { // vykoname INSERT $this->db->insert($this->getTable(),$data); return $this->db->insert_id(); } return false; } - Update:
public function update($data=array(),$id) { // ziskame primary key $primary = $this->getPrimaryKey(); // kontorla vstupneho ID if((int)$id==0) return false; // podmienka pre $data if($this->_checkData($data)) { $this->db->where($primary,$id); $this->db->update($this->getTable(),$data); return $this->db->affected_rows(); } return false; } - Delete:
public function delete($data=array()) { // podmienka ci pole $data je pole if($this->_checkData($data)) { $this->db->where($data); $this->db->delete($this->getTable()); return $this->db->affected_rows(); } return false; } - getTotal: získanie počtu záznamov
public function getTotal($data=array()) { // podmienka pre $data if($this->_checkData($data)) { $this->db->where($data); } return $this->db->count_all_results($this->getTable()); } - getByPk: získanie záznamu pomocou primary key (Pk)
public function getByPk($id) { // ziskame primary key $primary = $this->getPrimaryKey(); // podmienka ci $id obsahuje PK if(intval($id)!=0) { $this->db->where($primary,$id); $q = $this->db->get($this->getTable()); return $q->result(); } return false; } - getWhere: získanie záznamu s podmienkou WHERE
public function getWhere($data=array(),$offset=null, $limit=null) { // podmienka ci $data je pole if($this->_checkData($data)) { $this->db->where($data); } $q = $this->db->get($this->getTable(),$limit, $offset); return $q->result(); } - _checkData: kontrola vstupného poľa
private function _checkData($data) { if(is_array($data) AND count($data)>0) return true; return false; }
Aplikácia modelu v praxi
Takže sme si podrobne rozobrali každú metódu a teraz aplikujeme náš model v praxi.
Vytvoríme si User model.
/application/models/user_model.php
Model len rozšírime o objekt MY_model a nastavíme premenné $_table a $_primary_key
Predpokladajme, že máme tabuľku users:
CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL, `password` varchar(32) NOT NULL, `email` varchar(32) NOT NULL, PRIMARY KEY (`id`) );
class User_model extends My_Model {
function __construct() {
parent::__construct();
// nastavime nazov tabulky
$this->setTable('users');
// primary key
$this->setPrimaryKey('id');
}
}
Náš MY_Model má prednastavený primary key ako id, takže metódu $this->setPrimaryKey('id'); nemusíme volať.
Tak a to je všetko, stačí už len v Controlleri zavolať model user_model a všetky ostatné metody máme prístupné.
Controller
class User extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->model('user_model', 'model');
}
public function index()
{
$data = array();
$data['save'] = $this->model->save(
array(
'username'=>'jozko',
'email'=>'jozo@jozo')
);
$data['update'] = $this->model->update(
array(
'username'=>'jozkomrkvicka',
'email'=>'jozo@jozo'),
2);
$data['delete'] = $this->model->delete(array('id'=>2));
$data['getWhere'] = $this->model->getWhere();
$data['getByPk'] = $this->model->getByPk(5);
$data['getTotal'] = $this->model->getTotal();
$this->load->view('welcome_message',$data);
}
}
Veľkou výhodou je, že týmto spôsobom môžeme pristupovať k rôznym tabuľkám bez nutnosti vytvárania ďalších modelov alebo metód. Stačí zavolať metódu $this->setTable('posts'); a máme hneď prístupné metódy napr. pre tabuľku posts. Samozrejme tento spôsob sa niekomu može zdať ako neštandardný postup, keďže úlohou je čo najviac operácii presunúť do modelov. Uvádzam to len ako príklad čo sa dá s týmto prístupom robiť.
class User extends CI_Controller {
.
.
.
public function index()
{
$data = array();
.
.
.
.
// tu pozivame tabulku users
$data['getByPk'] = $this->model->getByPk(5);
$data['getTotal'] = $this->model->getTotal();
// tu napr. tabulku posts
$this->setTable('posts');
$data['post'] = $this->model->getByPk(5);
$this->load->view('welcome_message',$data);
}
}
Záver
Takže vytvorili sme úplne jednoduchú triedu, ktorá nám poskytne prístup k základným metódam. Cieľom bolo vytvoriť objekt s najčastejšie používanými metódami aby sme ich nemuseli pracne písať v každom modeli. V prípade rozsiahlejších projektov nám takéto riešenie môže urýchliť prácu.
3 komentáre k článku:
Komentovať môžu iba prihlásení
Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)
Prihlás sa tu, ak už máš profil na Zajtra.sk:
Ako bolo povedane na konci clanku, je to dost nestandardny pristup.
Ale ine som chcel. Z akeho dovodu, pouzivas stary php zapis pre private metody a atributy: _metoda(), _atribut, ked v tom istom riadku pouzivas novsi php zapis a to klucove slovo private? spatna kompatibilita tam nie je, pretoze stare phpcka private/public/protected nepoznaju a zbytocne tak len maties zaciatocnikov.
Na taketo nie moc najstastnejsie programatorske naviky by som si pri pisani clankov daval pozor.
Novinky
1 hod.
Hollywoodu se nelíbí dokument o TPB, snaží se jej odstranit
V únoru se k volném zhlédnutí a šíření objevil dokumentární film The Pirate Bay: AFK, který už stačil obejít monitory milionů uživatelů po celém světě. Jeho obsah a celkové vyznění se však nelíbí mnoha produkčním společnostem Hollywoodu...
9 hod.
Microsoft aktualizoval YouTube aplikaci pro Windows Phone na základě požadavků Google
Microsoft aktualizoval YouTube aplikaci pro Windows Phone, která v minulosti čelila kritice Googlu; ten dokonce požadoval její odstranění z Windows Phone Store.
9 hod.
Špionáž medzi štátmi: India pravdepodobne kradla dáta Pakistanu
Internetom sa šírili podvodné súbory, ktorých pravdepodobným cieľom bolo preniknúť do počítačov inštitúcií a občanov Pakistanu. Motívom útoku bolo odcudzenie citlivých informácií. Na prípad upozornila spoločnosť Eset.
1 dňom
Kim Dotcom: Vynašiel som dvojfaktorovú autentifikáciu, Google a Facebook porušujú môj patent
Kim Dotcom, zakladateľ Spojenými štátmi rozloženej služby pre zdieľanie súborov Megaupload, dnes prekvapil vyhlásením, že vynašiel dvojfaktorovú autentifikáciu a mnohé spoločnosti vrátane Google, Facebooku a Twitteru porušujú jeho patent.
1 dňom
Internet Explorer 10 chráni pred vírusmi viac ako konkurencia
Používatelia najnovšieho Internet Explorera sú pred škodlivými súbormi chránení viac ako priaznivci konkurenčných internetových prehliadačov...
Staršie novinky »TOP dlhšie
- 01 3 praktické CSS postupy, o ktorých ste možno nevedeli... (4805x)
- 02 3 jednoduché kroky ako spraviť responzibilný dizajn webu (4101x)
- 03 Fenomén doby: Dosť bolo transparentných ikoniek! (3914x)
- 04 PayPerPost.sk - zarábajte s webom na článkoch (3668x)
- 05 Prečo sa chcem naučiť programovať web stránky? (3586x)
- Aj ty môžeš byť najčítanejší. Napíš článok »
TOP tento mesiac
- 01 Poctivým zľavovým serverom sa naďalej darí (1012x)
- 02 Mobil Rulezz: Najlepšia brandovaná aplikácia z agentúry SCR (1006x)
- 03 HTML WebSocket - chat v node.js za 5 minút (868x)
- 04 Nová affiliate reklamná sieť z dielne VISIBILITY (764x)
- 05 Magazín Womanman už aj v Apple aplikácii (146x)
- Aj ty môžeš byť najčítanejší. Napíš článok »
Nové články:
- 19.HTML WebSocket - chat v node.js za 5 minút
máj - 14.Poctivým zľavovým serverom sa naďalej darí
máj - 9.Nová affiliate reklamná sieť z dielne VISIBILITY
máj - 26.Mobil Rulezz: Najlepšia brandovaná aplikácia z agentúry SCR
apr - 26.Magazín Womanman už aj v Apple aplikácii
apr - Viac »
- Aj ty môžeš byť najčítanejší. Napíš článok »
Pekné veci
Pekné veci
Pekné veci
Pekné veci
Posledné komentáre
- @- ani ty mna nechapes. od zaciatku sa to nejak povazovalo za komunitny web. pomahali sm...
- dik obom za info. presne o to mi ide, snazim sa zistit ci na blogu mozem pouzit foto ...
- no podla tvojej otazky... podla mna fotkan ako mercne ucely je pouzitelna aj pre a) aj p...
- Diky za článok :). +1 PS: ak niekto má nejaký dobrý článok o (WS) tomto nech dá vedieť ...
- hi ja pod fotkou na komercne ucely rozumiem to ze sa dane fotky idu nahodit na web kt...
Kritika
Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!
Reklama
Slovenská IT komunita
Seriály zo Zajtra.sk
· Ako písať blog
· Ako sa stať PHP ninja s Yii Frameworkom
· Aplikácie pre Facebook
· CSS triky
· iOS vývojára príhody a skúsenosti
· Modelovanie webového sídla
· Nauč sa CodeIgniter [HD]
· Nauč sa jQuery [HD]
· Nette PHP framework
· OOP v Javascripte
· Slovenskí iOS developeri
· Yablkov TurboTip [HD]



















Trochu zovšeobecnené. Konvencie pre zápis premenných sú z Pythonu a pre metódy z CI.
https://gist.github.com/1193277