YII ile Basit Veritabanı İşlemleri

Share Button

Aslında pek üstüne blog yazısı yazmaya deyecek bir konu olduğu söylenemez. :) Hem dağılan kafamızı biraz toparlayalım, hem de konuyu arayan birilerine Türkçe kaynak olsun. Hadi bakalım…

***

YII çatısı altında veritabanı uygulamaları geliştirirken dilerseniz DAO (Data Access Object), dilerseniz ORM (Object Relation Mapping) kullanarak veritabanına erişebilirsiniz.

1. DAO (Data Access Object) Kullanarak Veritabanı İşlemleri Gerçekleştirmek :

1. 1. Veritabanı Bağlantısı Oluşturmak

YII ile veritabanı bağlantısını isterseniz dilediğiniz herhangibir anda başlatıp sonlandırabilir veya doğrudan aplikasyon başladığı anda veritabanı bağlantısını başlatabilirsiniz. DAO nesnesi PDO dan türediği için sunucunuz tarafından desteklenen tüm PDO sürücülerini kullanabilir.

Aşağıdaki örnekte anlık veritabanı bağlantısının nasıl başlatılıp sonlandırıldığını görüyoruz.

$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'myuser';
$password = 'mypass';
$connection=new CDbConnection($dsn,$username,$password);
$connection->active=true; // veritabani baglantisini aciyoruz...
......
$connection->active=false;  // veritabani baglantisini kapatiyoruz...

Veritabanı bağlantısını uygulama ayağa kalktığında başlatmak için ise veritabanı erişim bilgilerini konfigürasyona yazmanız yeterli.
protected/config/main.php:

array(
    ......
    'components'=>array(
        ......
        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString'=>'mysql:host=localhost;dbname=testdb',
            'username'=>'myusername',
            'password'=>'mypassword',
            'emulatePrepare'=>true,  // YII nin sitesinde bazi SQL sorgulari icin gerekli oldugundan bahsediyor. Muhtemelen parametre iceren SQL sorgularinin dogrudan calistirilmamasi icin kullanilmasi gereken bir parametre.
        ),
    ),
)

Veritabanı bağlantısını ugulama ayağa kalktığında başlattığınızda connection nesnesine aşağıdaki şekilde ulaşabilirsiniz:

$connection = Yii::app()->db;

1. 2. SQL sorgusu çalıştırmak

SQL sorguları, veritabanı bağlantısı üzerinden bir fabrika metodu ile command nesnesinin yaratılıp bu nesnenin execute() edilmesi suretiyle gerçekleştirilir. Aslında bu kullanım şekli, PDOşinas olan arkadaşlarımıza son derece tanıdık gelecektir.

Adi bir select sorgusunu aşağıdaki şekilde çaılştırabilirsiniz.

/* @var $connection CDbConnection */
$connection = Yii::app()->db;
$sqlQuery = 'SELECT `id`, `name`, `amount` FROM `mytable` WHERE `id`=23';
/* @var $command CDbCommand */
$command = $connection->createCommand($sqlQuery);
/* @var $reader CDbDataReader */
$reader = $command->query();
foreach($reader as $row) {
 ...
}

YII, bize bir veritabanı sorgusunu çalıştırabilmemiz için aşağıdaki metodları sunar.

$rowCount=$command->execute();
/*
Bu kullanim, genellikle sonuc beklentisi olmayan 
INSERT, UPDATE, DELETE sorgulari icindir. Calitirildiginda 
sorgu sonucunda etkilenen satir sayisini doner.
*/

$dataReader=$command->query();   
/*
Bu kullanım şeklinde sonuc traversable bir obje olan 
CDbDataReader tipinde döner. Sorgu sonuclari döngü 
ile fetch edilir.
*/

$rows=$command->queryAll();
/*
Bu kullanim seklinde sorgu once calistirilir sonra tum 
sonuclar fetch edilir.
*/

$row=$command->queryRow();
/*
Bu kullanim seklinde sorgu once calistirilir sonra 
sonuca ait ilk satir fetch edilir.
*/

$column=$command->queryColumn(); 
/*
Bu kullanım şeklinde sorgu calistirilir ve sonucun ilk kolonu doner.
*/

$value=$command->queryScalar();  
/*
Bu kullanim sekli sorguyu calistirir ve ilk satirin ilk kolonunu doner.
*/

1. 3. Sorgu sonuçlarının fetch edilmesi

CDbCommand::query() metodu çağırıldığında CDbDataReader tipinde bir örnek üretilir. Sorgu sonuçlarını almak istediğinizde ise döngü içerisinde CDbDataReader::read() metodu tekrarlı olarak çağırılır.

$reader = $command->query();
while($row = $reader->read() ) {...}
foreach($reader as $row) {...}
//Bu kullanim sekli sorgu sonucundaki tum satirlari alir.
$rows = $reader->readAll();

1. 4. Transaction Kullanımı

Üstüne söylenecek çok fazla birşey yok. Sorguları çalıştırmaya başlamadan önce transaction ı başlatır sorguları çalıştırdıktan sonra commit edersiniz. Buyrun kod örneği :

$queries = array();
$queries[] = 'INSERT INTO `mytable` (`id`, `name`, `amount`) VALUES(1, 'zeynep', 100);';
$queries[] = 'INSERT INTO `mytable` (`id`, `name`, `amount`) VALUES(2, 'ayşe', 250);';
$queries[] = 'INSERT INTO `mytable` (`id`, `name`, `amount`) VALUES(3, 'elif', 115);';

$success = true;
$transaction = $connection->beginTransaction();
foreach($queries as $sqlQuery) {
    try {
        $connection->createCommand($sqlQuery)->execute();
    } catch(Exception $e) {
        $transaction->rollback();
        $success = false;
    }
}

if( $success ) {
    $transaction->commit();
}

Bir sonraki yazıda YII ‘nin basit, şirin ORM kütüphanesi ActiveRecord u inceleyeceğiz.
Sevgi, selam ötesi hürmet..

Share Button

About İbrahim Gündüz

1983 yılında İstanbul’da doğdu. İlkokul yıllarında cobol ve basic le olan tanışması, yazılıma olan ilgisini arttırdı 2005 yılında. Uludağ Üniversitesi Teknik Bilimler Meslek Yüksek Okulu Elektronik bölümünden mezun olan Gündüz, çeşitli alanlarda faaliyet gösteren kurumlarda yazılım geliştirici olarak görev almıştır. Mesleki ilgi alanları, ölçeklenebilir sistemler, uygulama entegrasyonları ve ödeme sistemleridir. Halen Markafoni back end geliştirici olarak çalışmaktadır.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir