№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:
Web Dasturlash
№23 Dars — Ma`lumotlar omboriga kirish huquqini beruvchi obektlar. (DAO)