Codeigniter kütüphaneleri genişletmemize imkan veriyor. Ben de projelerimde aynı şeyleri tekrar tekrar yazmaktan kaçınmak için model sınıfını genişlettim. Sizlerinde kullanabileceği hale getirip kullanımınıza sunuyorum.
MY_Model sınıfının İşimi oldukça kolaylaştırdığını söylemeliyim. Zaten Codeigniter’in database sınıfının active record özelliği ile neredeyse sql sorgusu yazmıyoruz. MY_Model ile kod yazmak daha eğlenceli bir hale geldi.
My_model Fonksiyonları
Controller dosyalarımızda kullanacağımız model sınıfınının fonksiyonları:
get_row_by_id($id, $ekstra=array()){} get_row_where($ekstra=array()){} get_rows($ekstra = array()){} get_count($ekstra=array()){} dropdown($value_column='', $text_column='', $ekstra=array()){} insert($data=array()){} update($id, $data=array()){} update_where($where = array(), $data=array()){} delete($id){} delete_where($where=array()){}
Fonksiyonların isimlerinden ne iş yaptıkları az çok anlaşılıyor.
Dikkatinizi fonksiyonların parametrelerine çekmek istiyorum. Select sorgusu yapan fonksiyonlarımızın hepsinde $ekstra adlı parametre var. $ekstra; order, limit, where, seçilecek alanlar, callback(joinler için kullancağız) için değerler içeren bir dizidir.
db_tables.php
Bu sınıfın çalışması için application->config dizini altında db_tables.php adında yeni bir dosya oluşturuyoruz. Bu dosyamızda veritabanımızda bulunan tablolar ve bu tablolara ait sutun bilgileri olacak.
MY_Model tablo ve sütun bilgileri olmadan çalışmaz!
Sınıfın kullanımına geçmeden önce örneklerimizde kullanacağımız veritabanını oluşturalım. Bunun için herkesin aşina olduğu yazilar,kategoriler ve yazi_kategori_iliskileri tablolarını kullanacağım.
db_tables.php dosyamızın içeriği:
if(!defined('BASEPATH')) exit('No direct script access allowed'); $config['db_tables'] = array( 'kategoriler' =>array( 'kategori_id', 'kategori_adi', 'kategori_seo', 'kategori_durumu', 'ust_kategori_id', ), 'yazi_kategori_iliskileri' =>array( 'kategori_id', 'yazi_id', ), 'yazilar' =>array( 'yazi_id', 'baslik', 'icerik', 'yazi_seo', 'yazi_tipi', 'yazi_durumu', ) );
My_model Sınıfının Kullanımı
Select sorguları yapan fonksiyonlara parametre olarak gönderdiğimiz $ekstra değişkenin alabileceği değerler :
select
Seçilmesini istediğimiz alanlar.
distinct
kayıtları distinct yaparak çekmek istiyorsanız bu değeri true göndermelisiniz.
order_by
Sıralamanın yapılacağı alan.
order
Sıralama şekli.
limit
Getirilmesini istediğiniz kayıt sayısı.
offset
Kaçıncı kayıttan itibaren kayıtların getirileceği bilgisi.
callback
Oluşturduğumuz model dosyası içerisinde kendi yazdığımız ve sorgu yaparken çağırılmasını istediğimiz fonksiyon veya fonksiyonları tutan dizi.
Örnek bir kod ile bütün hepsini kullanarak göstermeye çalışayım.
$ekstra = array( 'select' => 'yazi_id,baslik, icerik,', 'distinct' => TRUE, 'order_by' => 'baslik', 'order' => 'ASC', 'offset' => 5, 'limit' => 10, 'callback' => array() //kendi yazdığımız yazi_model'de fonksiyonları çağırır. İlerleyen kısımlarda değineceğim şimdilik takılmadan geçin. ); $this->yazi_model->get_rows($ekstra);
Oluşan sql sorguya da bakalım isterseniz. Fonksiyonumuzun ne yaptığını daha iyi anlayacağız.
SELECT DISTINCT `X`.`yazi_id`, `X`.`baslik`, `X`.`icerik` FROM (`my_yazilar` X) ORDER BY `X`.`yazi_id` DESC LIMIT 5, 10
Yukarıda verilen değerler dışında tabloda bulunan her sütun için şu şekilde değerler gönderebiliriz.
$ekstra = array( 'yazi_id' => 1, 'yazi_id__in' => array(1,2,4,6), 'yazi_id__or_in' => array(1,2,4,6), 'yazi_id__not_in' => array(3,7,8), 'yazi_id__or_not_in' => array(3,7,8), 'yazi_id__or' => 1, 'baslik__like' => 'Başlık 1', 'baslik__or_like' => 'Başlık 1', 'baslik__not_like' => 'Başlık 1', 'baslik__or_not_like' => 'Başlık 1' ); $this->yazi_model->get_rows($ekstra);
Oluşan sorguya bakalım.
SELECT `my_yazilar`.* FROM (`my_yazilar`) WHERE `my_yazilar`.`yazi_id` = 1 AND `my_yazilar`.`yazi_id` IN (1, 2, 4, 6) OR `my_yazilar`.`yazi_id` IN (1, 2, 4, 6) AND `my_yazilar`.`yazi_id` NOT IN (3, 7, 8) OR `my_yazilar`.`yazi_id` NOT IN (3, 7, 8) OR `my_yazilar`.`yazi_id` = 1 AND `my_yazilar`.`baslik` LIKE '%Başlık 1%' OR `my_yazilar`.`baslik` LIKE '%Başlık 1%' AND `my_yazilar`.`baslik` NOT LIKE '%Başlık 1%' OR `my_yazilar`.`baslik` NOT LIKE '%Başlık 1%' ORDER BY `my_yazilar`.`yazi_id` DESC
Artık $ekstra değişkenimizin yeteneklerini öğrenmiş olduğumuza göre örneklerimize geçebiliriz. Örneklerimizi üstte kod altında oluşan sorgu olacak şekilde vereceğim(Bazen de dönen sonucu vereceğim). Hem kodu hemde kodun oluşturduğu sql cümlesini görerek daha iyi olacağını düşündüm.
Öncelikle gidip yazi_model.php adında model dosyası oluşturuyoruz.
yazi_model.php
class yazi_model extends MY_Model { public function __construct() { //MY_Model sınıfımızın yapılandırıcısını çağırıyoruz. //İlk parametre tablo adı, ikinci parametre ise autoincrement alanımız olacak parent::__construct('yazilar', 'yazi_id'); } //callback fonksiyonu protected function join_kategori(&$ekstra=array()) { $this->db->select('C.kategori_id, C.kategori_adi, C.kategori_seo'); $this->db->join('yazi_kategori_iliskileri B',"$this->as.yazi_id=B.yazi_id"); $this->db->join('kategoriler C',"B.kategori_id=C.kategori_id"); if(isset($ekstra['kategori_id'])) { $kategori_id = $this->clean_id($ekstra['kategori_id']); $this->db->where("C.kategori_id",$kategori_id); } } }
Controller içerisinde modelimizi yüklüyoruz.
$this->load->model('yazi_model');
Tek kayıt getirir.
$this->yazi_model->get_row_by_id(2);
SELECT `X`.* FROM (`yazilar` X) WHERE `X`.`yazi_id` = 2 ORDER BY `X`.`yazi_id` DESC LIMIT 1
stdClass Object ( [yazi_id] => 2 [baslik] => Başlık 2 [icerik] => test test test test test [yazi_seo] => baslik-2 [yazi_tipi] => yazi [yazi_durumu] => yayinda )
Tek kayıt getirir.
$this->yazi_model->get_row_where(array('yazi_id'=>1,'yazi_durumu' => 'yayinda','order_by'=>'baslik','order'=>'ASC'));
SELECT `X`.* FROM (`yazilar` X) WHERE `X`.`yazi_id` = 1 AND `X`.`yazi_durumu` = 'yayinda' ORDER BY `X`.`yazi_id` DESC LIMIT 1
Bütün kayıtları getirir.
$this->yazi_model->get_rows();
SELECT `X`.* FROM (`yazilar` X) ORDER BY `X`.`yazi_id` DESC
$this->yazi_model->get_row_by_id(2, array('yazi_durumu' => 'yayinda','order_by'=>'baslik','order'=>'ASC'));
SELECT `X`.* FROM (`yazilar` X) WHERE `X`.`yazi_durumu` = 'yayinda' AND `X`.`yazi_id` = 2 ORDER BY `X`.`yazi_id` DESC LIMIT 1
Seçeceğiniz alanları virgülle ayırın (select => 'baslik, icerik')
$this->yazi_model->get_rows(array('yazi_durumu' => 'yayinda', 'select' => 'baslik,icerik'));
SELECT `X`.`baslik`, `X`.`icerik` FROM (`yazilar` X) WHERE `X`.`yazi_durumu` = 'yayinda' ORDER BY `X`.`yazi_id` DESC
Sorguda bir tane alan seçmek
$this->yazi_model->get_rows(array('yazi_durumu' => 'yayinda', 'select' => 'baslik','limit'=>5));
SELECT `X`.`baslik` FROM (`yazilar` X) WHERE `X`.`yazi_durumu` = 'yayinda' ORDER BY `X`.`yazi_id` DESC LIMIT 5
Gelen veri:
Array ( [0] => Başlık 5 [1] => Başlık 4 [2] => Başlık 3 [3] => Başlık 2 [4] => Başlık 1 )
Burada dönen sonuca dikkat edelim lütfen. Bir tane alan seçmesini istediğimiz zaman çift boyutlu dizinden tek boyutlu diziye çevirip bize nesneyi dönderiyor. Kodlarken bunu göz önüne alın.
Eğer tek satırlık bir kayıt çektiğimizde tek alanı seçersek $row->secilen alan ile değilde direkt $row değeri bize seçilen alanın değerini verir.
//Burada $row 'stdClass Object([yazi_id]=>2,[baslik]=>Başlık 1)' değerine eşit iken $row = $this->yazi_model->get_row_by_id(2,array('select'=>'yazi_id,baslik')); //Burada $row 'Başlık 2' değerine eşit olacaktır. $row = $this->yazi_model->get_row_by_id(2,array('select'=>'baslik'));
WHERE Koşulunda IN Kullanmak
$ekstra = array( 'limit' => 5, 'offset' => 3, 'yazi_id__in' => array(1, 3, 6, 7) ); $rows = $this->yazi_model->get_rows($ekstra);
SELECT `X`.* FROM (`yazilar` X) WHERE `X`.`yazi_id` IN (1, 3, 6, 7) ORDER BY `X`.`yazi_id` DESC LIMIT 3, 5
Codeigniterin html select form elamanını oluşturan form_select fonksiyonu için veri döndermek
$this->yazi_model->dropdown('yazi_id','baslik',array('yazi_durumu'=>'yayinda','order'=>'ASC','order_by'=>'baslik'));
SELECT `X`.`yazi_id`, `X`.`baslik` FROM (`yazilar` X) WHERE `X`.`yazi_durumu` = 'yayinda' ORDER BY `X`.`yazi_id` DESC
Array ( [5] => Başlık 5 [4] => Başlık 4 [3] => Başlık 3 [2] => Başlık 2 [1] => Başlık 1 )
Kayıt sayısını almak
$this->yazi_model->get_count();
SELECT COUNT(*) AS adet FROM (`yazilar` X)
$this->yazi_model->get_count(array('yazi_durumu' => 'yayinda','yazi_tipi'=>'yazi'));
SELECT COUNT(*) AS adet FROM (`yazilar` X) WHERE `X`.`yazi_durumu` = 'yayinda' AND `X`.`yazi_tipi` = 'yazi'
Gördüğünüz gibi yuraya kadar yaptığımız örnekler için model dosyasında herhangi bir fonksiyon yazmak zorunda kalmadım. İşimiz oldukça kolaylaştı değil mi?
Join yapmamız gereken sorgularımızda biraz iş düşüyor bize. Joinler için yukarıda bahsettiğim callback parametresini kullanacağız.Öncelikle yukarıda yazi_model.php dosyasının içeriğinde join_kategori fonkisyonuna bir göz atınız. Göz attınız değil mi? :) . Ozaman örnek kodumuza bakabiliriz. Kullanımı oldukça basit.
$ekstra = array( 'order_by' => 'baslik', 'order' => 'ASC', 'limit' => 10, 'callback' => array('join_kategori'), 'kategori_id' => 1 ); $row = $this->yazi_model->get_rows($ekstra);
Oluşan sorguya göz atalım isterseniz.
SELECT `C`.`kategori_id`, `C`.`kategori_adi`, `C`.`kategori_seo`, `X`.* FROM (`yazilar` X) JOIN `yazi_kategori_iliskileri` B ON `X`.`yazi_id`=`B`.`yazi_id` JOIN `kategoriler` C ON `B`.`kategori_id`=`C`.`kategori_id` WHERE `C`.`kategori_id` = 1 ORDER BY `X`.`yazi_id` DESC LIMIT 10
Geriye kalan insert, update,update_where,delete,delete_where kullanımı gayet açık zaten onları açıklamaya gerek yok diye düşünüyorum.
En başından hızlı bir şekilde kullanımını özetleyelim.
- Kütüphaneyi application->core dizini altına atıyoruz.
- aplication->config dizini altında db_tables.php adında yeni bir config dosyası oluşturuyoruz ve veritabanımızda bulunan tablo ve sütun bilgilerini bu dosyaya yukarıda gösterdiiğim şekilde ekliyoruz.
- Yeni bir tane model dosyası oluşturuyoruz ve MY_Model sınıfından türetiyoruz. İlk parametre tablo adı ikinci parametre ise eğer tablonun auto increment(id) alanı varsa bu alanın adı olacak şekilde MY_Model’in yapılandırıcısını kendi oluşturduğumuz modelin yapılandırıcısında çağırıyoruz.
- Controller dosyamızda modelimizi yükleyerek kullanıma hazır hale getiriyoruz.
Elimden geldiğince kullanımını anlatmaya çalıştım. Yine takıldığınız noktalarda yorum yazarak sorabilirsiniz. Sınıfta eksikler veya yanlış kodladığım kısımlar olabilir. Eksik gördüğünüz veya şöyle olsaydı daha iyi olurdu veya şu da olsun dediğiniz şeyler varsa iletirseniz sevinirim.
İyi çalışmalar.
Son Güncelleme : 10 Şubat 2012
Birçok arkadaşla beraber benimde işime yarayacak teşekkür ederim.
SÜPER! Muhteşem ve enfes… Sağol dostum.