spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

Jan Ranostaj 11.8.2011
Hodnoť článok:
0 0

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

  1. Setter: pre nastavene nazvu tabulky
        public function setTable($table)
        {
            $this->_table = $table;
        }
    
  2. Getter: pre nazov tabulky
        public function getTable()
        {
            return $this->_table;
        }
    
  3. Setter: nastavene primárneho kľúča
        public function setPrimaryKey($key)
        {
            $this->_primary_key = $key;
        }
    
  4. Getter: získanie primárneho kľúča
        public function getPrimaryKey()
        {
            return $this->_primary_key;
        }
    
  5. 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;
       }
    
  6. 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;
       }
    
  7. 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;
       }
    
  8. 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());
       }
    
  9. 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;
    
          }
    
  10. 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();
    
       }
    
  11. _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.

Stiahni kod

Jan Ranostaj Jan Ranostaj

Programátor, vývojár aplikácii.


Hodnoť článok:
0 0

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:


Zabudol som heslo

0 0 YaD 4.9.2011 20:29:46
Trochu zovšeobecnené. Konvencie pre zápis premenných sú z Pythonu a pre metódy z CI.

https://gist.github.com/1193277
0 0 Moďerný Občan 17.8.2011 09:35:32
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.
0 0 Michal Chovanec 13.8.2011 08:50:09
podarilo sa, vďaka
Zajtra.sk > Programovanie > PHP > CodeIgniter : Core model


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama