№23 Dars - Ma`lumotlar omboriga kirish huquqini beruvchi obektlar. (DAO)

DAO ma`lumotlarni turli ma`lumotlar omborida saqlash va kirish huquqi uchun umumiy API sini taqdim etgan. Foydalanilayotgan ma`lumotlar omboridan boshqa ixtiyoriy ma`lumotlar omboriga o`tishda ma`lumotlarga kirish huquqi uchun DAO dan foydalanilganda hech qanday muommo bo`lmaydi va kodlarni o`zgartirishimiz ham kerak bo`lmaydi.

Yii DAO PHP Data Objects (PDO) ustiga qurilgan bo`lib, ko`pgina ma`lumotlar omboriga kirish huquqi uchun foydalaniladi, misol uchun MySQL, PostgreSQL va shu kabilar. Shu sababli Yii DAO dan foydalanishda PDO (dinamic library) dinamik kutubxonasi o`rnatilgan bo`lishi va foydalanilayotgan ma`lumotlar omboridagi PDO drayveri bilan mos bo`lishi kerak.(Misol uchun PDO_MYSQL)

Yii DAO 4 llassdan tashkil topgan:

  • CDbConnection: ma`lumotlar omboriga bog`lanishni ifodalaydi.
  • CDbCommand: ma`lumotlar omborida amalga oshishi kerak bo`lgan so`rovni ifodalaydi.
  • CDbDataReader: So`rovga javob qaytaruvchi bir yo`nalishdagi ma`lumotlar satri oqimini ifodalaydi..
  • CDbTransaction: Ma`lumotlar ombori tranzaksiyasini ifodalaydi.

Keyinchalik turli xil misollarda Yii DAO dan foydalanishni ko`rib chiqamiz.

Ma`lumotlar ombori bilan bog`lanish.

Ma`lumotlar ombori bilan bog`lanishni o`rnatish uchun CDbConnection klassini hosil qilishimiz va faollashtirishimiz kerak bo`ladi. Qo`shimcha ma`lumot : ma`lumotlar omboriga bog`lanish uchun

(host, port, foydalanuvchi nomi, paroli, va boshqalarini) va DSN (Data Source Name) ni ko`rsatib qo`yish kerak bo`ladi.

$connection=new CDbConnection($dsn,$username,$password);
// bog`lanishni o`rnatamiz
// try…catch   mumkin bo`lgan qoidalarni to`xtatish uchun konstruktoridan foydalanamiz $connection->active=true;
…
$connection->active=false;  // bog`lanishni yopish

DSN formati foydalanilayotgan PDO drayveriga bog`liq. DSN ni qurishda foydalanilayotgan drayver bog`lanishi sintaksisiga mos PDO drayveri nomi va ikki nuqtadan keyin bog`lanish parametrlari ko`rsatiladi. Batafsil PDO bu yerdan tanishishingiz mumkin. Quyida bir qancha asosiy DSN formatlari ko`rsatilgan:

  • SQLite: sqlite:/path/to/dbfile
  • MySQL/MariaDB: mysql:host=localhost;dbname=testdb
  • PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
  • SQL Server: mssql:host=localhost;dbname=testdb
  • Oracle: oci:dbname=//localhost:1521/testdb

Haqiqiy ilova komponentlarida undan foydalanishimiz mumkin, shu boisdan CDbConnection i CApplicationComponent klass vorisidir. Bu uchun db komponentini quyidagicha holatda ilova konfiguratsiyasini qilish kerak:

array(
    …
    'components'=>array(
        …
        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString'=>'mysql:host=localhost;dbname=testdb',
            'username'=>'root',
            'password'=>'password',
            'emulatePrepare'=>true,  // MySQL ning bir qancha ilovalari uchun kerak
        ),
    ),
)

Endi biz Yii::app()->db orqali ma`lumotlar ombori bilan bog`lanishga kirish xuquqini olishimiz mumkin. Faol bo`lmagan bog`lanishlar uchun CDbConnection::autoConnect da false belgisini o`rnatishimiz kerak. Bu usul kodning ixtiyoriy joyidan ma`lumotlar ombori bilan bog`lanishga imkon beradi.

SQL so`rovlardan foydalanish

Qachonki biz ma`lumotlar omboriga ulansak unda biz CDbCommand dan foydalanib SQL so`rovini bajarishimiz mumkin. Buning uchun CDbCommand class nusxasini hosil qilib CDbConnection::createCommand() orqali SQL so`rovini ko`rsatishimiz mumkin bo`ladi:

$connection=Yii::app()->db; // komponent orqali "db" bilan bog`lanish
// Ochiqdan ochiq murojaat uchun bu usulni ham qo`llash mumkin
// $connection=new CDbConnection($dsn,$username,$password);


$command=$connection->createCommand($sql);
// bizga kerak bo`lgan SQL so`rovlar berishimiz mumkin  
// $command->text=$newSQL;

CDbCommand dan foydalanish bilan SQL so`rovlarni bajarishning ikki xil usul mavjud:

  • execute(): INSERT, UPDATE va DELETE SQL so`rovlarini ishlatish uchun.
  • query(): qaytuvchi ma`lumotlar oqiminig SQL so`rovlarini bajarishda, misol uchun SELECT so`rovi. Agar so`rov muvofaqiyatli bajarilsa CDbDataReader klassi nusxasi yordamida qaytgan ma`lumotlarni olish huquqiga ega bo`lamiz.

Agar jarayon paytida qandaydir xatolik bo`lsa unda bu jarayonni amalga oshirmaydi. Ya`ni jadvalda sizga halaqit qiluvchi va dasturni bizuvchi qoldiqlar qoldirmaydi.

$rowCount=$command->execute();   // `INSERT`, `UPDATE` yoki`DELETE` turidagi so`rovlarni bajarish uchun
$dataReader=$command->query();   // `SELECT` turidagi so`rovlarini bajarish uchun
$rows=$command->queryAll();      // so`rov natijasidagi barcha satrlarni olish 
$row=$command->queryRow();       // so`rov natijasidagi birinchi satrni qaytaradi.
$column=$command->queryColumn(); // so`rov natijasidagi birinchi ustunni qaytaradi.
$value=$command->queryScalar();  //birinchi maydondagi birinchi satrni qaytaradi ya`ni birinchi katakcha qiymatini.

So`rov natijalari bilan ishlash

CDbDataReader klassi nusxasidagi CDbCommand::query() orqali natijalarni yig`amiz va CDbDataReader::read() usuli orqali natijalarni satrma-satr o`qiymiz. Ma`lumotlarni satrma-satr o`qib olishimiz uchun shuningdek foreach orqali CDbDataReader dan foydalanamiz.

$dataReader=$command->query();
// ko`p martalik read() murojaat bo`lib toki false qiymat qaytarmaguncha ishlaydi. Ya`ni olingan barcha ma`lumotlar hammasi tugaguncha 
while(($row=$dataReader->read())!==false) { … }
//ma`lumotlarga satrma satr murojaat uchun foreach dan foydalanamiz.
foreach($dataReader as $row) { … }
// barcha satrlarni massivga yig`amiz
$rows=$dataReader->readAll();

Izoh: Barcha queryXXX() larning query() dan farqi to`g`ridan-to`g`ri ma`lumot qaytarishidadir. Misol uchun , queryRow() metodi joriy satr natijasi bo`yicha massiv qaytaradi.

Tranzaksiyadan foydalanish

Bir qancha so`rovlarni bir vaqtning o`zida bajarilishini, ya`ni hamma so`rovlar aniq bajarilishi kerak, biri bajarilmay qolgan holatda qolgan barcha bajarilgan so`rovlarni ortga qaytarib asl holiga qaytarib qo`yish kerak. Bunday holatda tranzaksiya ishlatiladi va CDbTransaction klassidan foydalaniladi. CDbTransaction klassini ishlash usuli quyidagicha:

  • Tranzaksiya boshlanadi.
  • So`rovlar birma bir amalga oshiriladi. Bunday holatda tranzaksiya o`zgargan ma`lumotlarni keshida saqlaydi, ma`lumotlar omborida xech qanday o`zgarish bo`lmaydi. Lekin ma`lumotlar ombori qaytarishi kerak bo`lgan ma`lumotlarni qaytaradi. Ya`ni siz saqlayotgan $sql1 satrning id si kerak bo`lsa va bu keyingi $sql2 jadvalingiz uchun tashqi kalit sifatida kerak bo`lsa sizga ushbu idni qaytara oladi, garchi ma`lumotlar omboriga saqlanmagan bo`lsa ham.
  • Agarda tranzaksiyadagi so`rovlar muvofaqiyatli bo`lsa tranzaksiya amalga oshadi va ma`lumotlar omboridagi ma`lumotlarga o`zgarishlar kiradi.
  • Agarda so`rovlar paytida qandaydir xatolik ro`y bersa, barcha so`rovlarni ortga qaytarib qo`yadi.

Bir kichik ko`rinishi quyidagicha:

$transaction=$connection->beginTransaction();
try
{
    $connection->createCommand($sql1)->execute();
    $connection->createCommand($sql2)->execute();
    // SQL-so`rovlari
    $transaction->commit();
}
catch(Exception $e)
{
    $transaction->rollback();
}

Bu maqolada ishlatish usullari va qoidalari haqida gap ketdi. Keyingi maqolalarda misollar bilan keltirishga harakat qilaman.

Manba:


JONNY

Muallif haqida

JONNY Arduino, Java, C#, Android, Windows, Linux, Debian, Javascript.


Blogdagi so‘nggi maqolalar:


Birinchi bo‘ling!

Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!