Ma'lumotlar ombori bilan ishlash ¶
Bu bo'lim sizga yangi sahifani yaratishga yordam beradi, u sahifa esa countries
jadvalidan kelgan ma'lumotlarni chiqarib beradi. Buning uchun esa siz ma'lumotlar ombori bilan aloqani sozlashingiz kerak, klass yaratish Active Record,amalni va ko'rinish yaratishimiz.
Bu bo'limda siz nimalarni o'rganasiz:
- Qandey qilib ma'lumotlar omboriga ulanish.
- Active Record klassini yasash
- Ma'lumotlarni olishni, Active Recordni ishlatishni.
- viewda ma'lumotlarni sahifalarga bo'lib chiqarishni.
Etibor bering, shu bo'limni o`zlashtirish uchun, siz ma'lumotlar ombori bilan ishlash bilimingiz bo'lishi kerak. Aniqroq esa,siz hech ma'lumotlar omborini yasashni va unga SQL-so'rov jo'natishni, ma'lumotlar ombori klientlarini ishlatishni bilishingiz kerak.
Ma'lumotlar omborini tayyorlaymiz ¶
Birinchi bo'lib yii2basic
nomli ma'lumotlar ombri yarating, chunki undan siz web ilovadan ma'lumotlarni qabul qilasiz.
Ma'lumotlar omborini siz SQLite, MySQL, PostgreSQL, MSSQL yoki Oracle da yaratishingiz mumkin, chunki Yiida aytib o'tilgan barcha ma'lumotlar ombori bilan ishlay oladi. Soddalik uchun keyinchalik, ma'lumotlar ombori misol uchun MYSql haqida gap boradi.
Endi esa ma'lumotlar omborida country
degan jadval yarating va unga ozgina misol uchun ma'lumotlar qo'shing. Siz quydagi SQL-buyruqni bajarishingiz mumkin yuqorida aytilgan amalarni bajarish uchun:
CREATE TABLE `country` (
`code` CHAR(2) NOT NULL PRIMARY KEY,
`name` CHAR(52) NOT NULL,
`population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `country` VALUES ('AU','Australia',24016400);
INSERT INTO `country` VALUES ('BR','Brazil',205722000);
INSERT INTO `country` VALUES ('CA','Canada',35985751);
INSERT INTO `country` VALUES ('CN','China',1375210000);
INSERT INTO `country` VALUES ('DE','Germany',81459000);
INSERT INTO `country` VALUES ('FR','France',64513242);
INSERT INTO `country` VALUES ('GB','United Kingdom',65097000);
INSERT INTO `country` VALUES ('IN','India',1285400000);
INSERT INTO `country` VALUES ('RU','Russia',146519759);
INSERT INTO `country` VALUES ('US','United States',322976000);
Hozirda sizda yii2basic
degan ma'lumotlar ombori bo'lishi kerak va unda 3 ta ustundan iborat country
degan jadval bo'lishi kerak, o'nta satrdan iborat ma'lumot bilan.
Ma'lumotlar omborida bilan aloqani sozlaymiz ¶
Ishni boshlashdan oldin sizda PDO kengaytmasi o'rnatilganiga amin bo'ling va PDO-boshqaruvchisi ma'lumotlar ombori bilan boshqara olishingiz uchun(misol uchun, pdo_mysql
MYSql uchun). Bu siz aloqali ma'lumtolar ombori bilan ishlashingiz uchun assosiy talablardir.
Endi esa, hammasini o'rnatib bo'lganingizdan so'ng, config/db.php
oching va sozlamalarni o`zingizni ma'lumotlar omboringiz sozlamalariga o'zgartiring. Boshlanish sozlamalar quydagichadir:
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
Fayl config/db.php
— oddiy sozlamalar vositasidir, faylarda assoslangan. Quydagi sozlama fayli yii\db\Connection klass nusxasini olish uchun kerak bo'lgan assosiy talablarga javob beradigan sozlamalardan iboratdir, undan esa siz SQL-buyruqlarni ma'lumotlar omboriga jonatishingiz mumkin.
Ma'lumotlar omboriga yuqoridagi sozlamalar sozlab bo'lgandan so'ng ulanish, undan foydalanish uchun Yii::$app->db
orqali amalga oshiriladi.
Ma'lumot uchun: fayl
config/db.php
ilovaning assosiy sozlama fayli orqali ulanadiconfig/web.php
, u esa web-ilova nusxasini sozlamalarini o'z ichiga oladi. qo'shimcha ma'lumot uchun, iltimos, ushbu Sozlamalar bo'limga ko'rib chiqing.
Agar siz frameworkda yo'q bo'lgan ma'lumotlar omborlari bilan ishlashingiz kerak bo'lsa quydagi kengaytmalarga etibor bering:
Active Record klassi (sinf) avlodini yaratamiz ¶
country
dan ma'lumotlarni olib ishlatib ko'rish uchun, Active Recordni kengaytirgan klass yarating, nomi Country
va uni models/Country.php
fayliga saqlang.
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Country extends ActiveRecord
{
}
Country
klassi yii\db\ActiveRecordni kengaytirmoqda. Siz uning ichida bir satr kod ham yozmasligingiz mumkin! Yuqoridagi kod assosida Yii o'zi ma'lumotlar omboridagi jadval va klass orasida aloqa yasaydi.
Ma'lumot uchun: Agar ma'lumotlar omboridagi nom va klassnomi orasida bir xillikni saqlash imkoni bo'lmasa siz klassga aynan jadal ismini yii\db\ActiveRecord::tableName() usuli orqali yozishingiz mumkin.
Country
klassini ishlatganingizda, siz osonlikcha country
jadvalidagi ma'lumotlar bilan boshqarishingiz mumkin, misol uchun pastdagi qatorlarda shuni ko'rishingiz mumkin:
use app\models\Country;
// "country" jadvalidan hamma ma'lumotlarni qabul qilamiz va ularni "name" ustuni bo'yicha saralaymiz.
$countries = Country::find()->orderBy('name')->all();
// "US" jadval ka'liti bo'yicha ma'lumotni olib beradi.
$country = Country::findOne('US');
//"United States"
echo $country->name;
// nomi o`zgartiramiz "U.S.A."ga va ma'lumotlar omborida saqlaymiz.
$country->name = 'U.S.A.';
$country->save();
Ma'lumot uchun: Active Record — bu ma'lumotlar ombori bilan ishlash uchun juda ham mukammal vosita hisoblanadi. Yana ko'oproq ma'lumotni siz Active Record bo'limida topishingiz mumkin. Qo'shimcha tariqasida, siz yana boshqa yanada past qism vositasi Data Access Objectsdan foydalanishingiz mumkin.
Amal yaratamiz ¶
Ma'lumotlarni foydalanuvchiga ko'rsatish uchun siz amal yaratishingiz kerak. Oldingi misolarda farqli o'laroq site
nazoratchisi ichida amal yasash o'rniga to'g'riroq buning uchun maxsus nazoratchi yasab unga hamma usularni yig'ish to'g'riroq bo'ladi,Yangi nazoratchini CountryController
deb nomlang, va unda index
degan amal yarating uning ichida pastda ko'rsatilgandek ma'lumot kiriting:
<?php
namespace app\controllers;
use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;
class CountryController extends Controller
{
public function actionIndex()
{
$query = Country::find();
$pagination = new Pagination([
'defaultPageSize' => 5,
'totalCount' => $query->count(),
]);
$countries = $query->orderBy('name')
->offset($pagination->offset)
->limit($pagination->limit)
->all();
return $this->render('index', [
'countries' => $countries,
'pagination' => $pagination,
]);
}
}
Yuqoridagi kodni quydagicha saqlang controllers/CountryController.php
.
index
amali Country::find()
ni chaqirmoqda. Ushubu Active Record usuli country
jadvalidan hamma ma'lumotlarni qaytaradi.
kelayotgan ma'lumotlar bo'lish sahifalarga bo'lish uchun yii\data\Pagination klassi ishlatilmoqda. Pagination
nusxasi ikkta maqsadga kerak:
offset
valimit
SQL-buyrug`i uchun belgilanadi, bu esa birmartada faqat bitta sahifani qaytarishga berilgan (bitta sahifada misl uchun 5 ta satr)- u esa viewda paginatsiya (pagination) chiqarilishi uchun ishlatilmoqda, turi esa sonlardan iborat, bularni hammasini oldinda tushuntirilib kelinadi.
Kodni oxirida esa index
amali index
ko'rinishini chiqarib beradi, unga hamma chiqarilishi kerak bo'lgan ma'lumotlarni va paginatsiyanni qaytarayapti.
Ko'rinish yaratamiz ¶
Birinchi bo'lib country
degan papka ochamiz views
ichida. Bu papka hamma nazoratchi ko'rinishlarni saqlash uchun ishlatamiz. Ushbu papkada views/country
fayl yaratamiz index.php
, so'ng quydagi kodni yozamiz:
<?php
use yii\helpers\Html;
use yii\widgets\LinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
<li>
<?= Html::encode("{$country->code} ({$country->name})") ?>:
<?= $country->population ?>
</li>
<?php endforeach; ?>
</ul>
<?= LinkPager::widget(['pagination' => $pagination]) ?>
Ko'rinish ikkta qisimga bo'lingan ma'lumot chiqishiga nisbatan. Ko'rinishni birinchi qismida ma'lumotlar tartibsiz HTML-ro'yxati kabi chiqayapti.
Ikkinchisida esa yii\widgets\LinkPager vidjiti, u ko'rinishga qaytarilayotgan paginatsiya ma'lumoti assosida shaklanadi. Vidjet LinkPager
sahifalar tugalarini chiqarib beradi. Ulardan birortasiga bosangiz sahifa yangilanib ma'lumotlar o'zgaradi
Keling sinab ko'raylik ¶
Yuqoridagi yozgan kodni ishlashini ko'rish uchun iltimos ushbu yo'l (url) bo'yicha o'ting:
http://hostname/index.php?r=country%2Findex
Boshida siz ma'lumotlar omboridan beshta ma'lumotni chiqarib berganini ko'rishingiz mumkin. Ma'lumotlar ostida. Agar siz "2" tugmasiga bosangiz, keyingi ikkinchi sahifa ma'lumotlarini ko'rsatayotganini ko'rishingiz mumkin. Etibor bilan qarasangiz, URLda ham quydagi "2" sahifa chiqti.
http://hostname/index.php?r=country%2Findex&page=2
Pagination Ma'lumotlarni sahifalarga bo'lib qisman chiqarish umumiy ishlash tartibi esa quydagicha:
- Boshida Pagination birinchi sahifani ko'rsatadi, uning SQL-buyrugi qismi
LIMIT 5 OFFSET 0
bo'ladi. Natijada, birinchi beshta ma'lumot qaytarilib ko'rsatiladi. - Vidjet LinkPager URLdagi ma'lumotda assosan tugmachalarni shaklantirib beradi, Urlni esa Pagination. Bu URLda
page
parametri mavjud bo'ladi, tugmachalarda esa xar xil page parametri mavjud. - Agar "2" tugmasiga bosangiz, sahifa yangilanib
country/index
uchun yangi so'rov amalga oshadi. Shundey qilib SQL-so'roviLIMIT 5 OFFSET 5
tashkil qiladi va keying beshtalikni qaytaradi.
Xulosa ¶
Quydagi bo'limda siz ma'lumotlar ombori bilan ishlashni o'rgandingiz. Shundey qilib siz yana ma'lumotlarni qismlarga bo'lib chiqarishni o'rgandingiz sizga yii\data\Pagination va yii\widgets\LinkPager yordam berdi.
Keyingi bo'limda esa siz kodni yasash uchun juda kuchli Gii vositasini ishlatishni o'rganasiz, uning yordamida siz juda ko'p ishlatiladigan masalalarni hal qilishingiz mumkin, Shulardan Create-Read-Update-Delete (CRUD) ma'lumotlar ombori jadvali bilan ishlash. Aslida siz hozir Gii yasaydigan kodni yuqorida yozib chiqdingiz, Yiida siz shularni avotmatik tarzda Gii yordamida kodni yaratishingiz mumkin.