mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-01 03:26:36 +08:00 
			
		
		
		
	 bdb7c64910
			
		
	
	bdb7c64910
	
	
	
		
			
			* Updated php.net link for some MemCache properties [skip ci] * Changed protocol to https for links to php.net in comments * Changed protocol to https for links to php.net in code * Changed www.php.net (http) to secure.php.net (https) in comments * Changed www.php.net (http) to secure.php.net (https) in code * Changed protocol to https for links to php.net in UPGRADE.md * Changed protocol to https for links to pecl.php.net in comments * Changed us.php.net to secure.php.net (https) in comments * Changed protocol to https for links to php.net in docs * Changed www.php.net (http) to secure.php.net (https) in docs * Changed protocol to https for links to pecl.php.net in docs * Changed ru/jp.php.net to secure.php.net (https) in docs Don't sure about russian guide: is this links meant to be for guide on russian, or not?
		
			
				
	
	
		
			258 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			258 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| Робота з базами даних
 | ||
| =====================
 | ||
| 
 | ||
| Цей розділ описує, як створити нову сторінку, яка буде відображати дані країни, отримані з
 | ||
| таблиці `country` бази даних. Для цього, вам необхідно буде налаштувати зʼєднання з базою даних,
 | ||
| створити клас [Active Record](db-active-record.md), визначити [дію](structure-controllers.md)
 | ||
| та створити [представлення](structure-views.md).
 | ||
| 
 | ||
| В даному розділі ви дізнаєтесь як:
 | ||
| 
 | ||
| * налаштувати зʼєднання з базою даних;
 | ||
| * визначити клас Active Record;
 | ||
| * запитувати дані за допомогою класу Active Record;
 | ||
| * відображати дані у представленні із розділенням на сторінки.
 | ||
| 
 | ||
| Зверніть увагу, що для того, щоб закінчити цей розділ, ви повинні мати базові знання і досвід використання баз даних. 
 | ||
| Зокрема, ви повинні знати, як створювати бази даних та як виконувати SQL-запити за допомогою клієнтських додатків баз даних.
 | ||
| 
 | ||
| 
 | ||
| Підготовка бази даних <span id="preparing-database"></span>
 | ||
| ---------------------
 | ||
| 
 | ||
| Для початку, створіть базу даних `yii2basic`, з якої і будете надалі отримувати дані. 
 | ||
| Ви можете створити базу даних SQLite, MySQL, PostgreSQL, MSSQL або Oracle, Yii має вбудовану підтримку для багатьох баз даних.
 | ||
| Для простоти, у подальшому описі будемо вважати що використовується MySQL.
 | ||
| 
 | ||
| Далі, створіть таблицю `country` у базі даних, і внесіть декілька зразків даних. Можете використати наступний SQL-запит, як приклад:
 | ||
| 
 | ||
| ```sql
 | ||
| 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);
 | ||
| ```
 | ||
| 
 | ||
| На даний момент, у вас є база даних `yii2basic` і таблиця `country` з трьома колонками, що містить десять рядків даних.
 | ||
| 
 | ||
| Налаштування підключення до БД <span id="configuring-db-connection"></span>
 | ||
| ------------------------------
 | ||
| 
 | ||
| Перш ніж продовжити, переконайтеся, що у вас встановлено розширення PHP [PDO](https://secure.php.net/manual/en/book.pdo.php)
 | ||
| та драйвер PDO для вашої БД (наприклад `pdo_mysql` для MySQL). Це є основною вимогою,
 | ||
| якщо ваш додаток використовує реляційну базу даних.
 | ||
| 
 | ||
| Коли вони встановлені, відкрийте файл `config/db.php` і змініть параметри для відповідності вашій БД.
 | ||
| За замовчуванням, файл містить наступне:
 | ||
| 
 | ||
| ```php
 | ||
| <?php
 | ||
| 
 | ||
| return [
 | ||
|     'class' => 'yii\db\Connection',
 | ||
|     'dsn' => 'mysql:host=localhost;dbname=yii2basic',
 | ||
|     'username' => 'root',
 | ||
|     'password' => '',
 | ||
|     'charset' => 'utf8',
 | ||
| ];
 | ||
| ```
 | ||
| 
 | ||
| Файл конфігурації `config/db.php` є типовим інструментом [налаштування](concept-configurations.md) на основі файлів. 
 | ||
| Даний файл конфігурації визначає параметри, які необхідні для створення та ініціалізації екземпляру [[yii\db\Connection]],
 | ||
| через який ви можете робити SQL-запити до зазначеної бази даних.
 | ||
| 
 | ||
| З’єднання з БД, описане вище, може бути доступне в коді додатка за допомогою виразу `Yii::$app->db`.
 | ||
| 
 | ||
| > Info: Файл конфігурації `config/db.php` буде включений до конфігурації головного додатка `config/web.php`,
 | ||
| який визначає як має бути проініціалізований екземпляр [додатку](structure-applications.md).
 | ||
| Для отримання додаткової інформації, будь ласка, зверніться до розділу [Конфігурації](concept-configurations.md).
 | ||
| 
 | ||
| 
 | ||
| Створення Active Record <span id="creating-active-record"></span>
 | ||
| -----------------------
 | ||
| 
 | ||
| Для репрезентації та отримання даних з таблиці `country` створіть похідний від [Active Record](db-active-record.md)
 | ||
| клас з іменем `Country`, і збережіть його в файл `models/Country.php`.
 | ||
| 
 | ||
| ```php
 | ||
| <?php
 | ||
| 
 | ||
| namespace app\models;
 | ||
| 
 | ||
| use yii\db\ActiveRecord;
 | ||
| 
 | ||
| class Country extends ActiveRecord
 | ||
| {
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| Клас `Country` наслідує [[yii\db\ActiveRecord]]. Вам не потрібно писати ніякого коду всередині нього! 
 | ||
| Всього лише за допомогою описаного вище коду, Yii самостійно вгадає відповідне імʼя таблиці з імені класу.
 | ||
| 
 | ||
| > Info: Якщо неможливо отримати прямої відповідності імені класу до імені таблиці, ви можете
 | ||
| перевизначити метод [[yii\db\ActiveRecord::tableName()]], щоб точно задати відповідне імʼя таблиці.
 | ||
| 
 | ||
| Використовуючи клас `Country`, ви можете легко маніпулювати даними з таблиці `country`, як показано у цих фрагментах коду:
 | ||
| 
 | ||
| ```php
 | ||
| use app\models\Country;
 | ||
| 
 | ||
| // отримати всі рядки з таблиці country і відсортувати їх по "name"
 | ||
| $countries = Country::find()->orderBy('name')->all();
 | ||
| 
 | ||
| // отримати рядок, по основному ключу "US"
 | ||
| $country = Country::findOne('US');
 | ||
| 
 | ||
| // відобразити "United States"
 | ||
| echo $country->name;
 | ||
| 
 | ||
| // змінити назву країни на "U.S.A." і зберегти в БД
 | ||
| $country->name = 'U.S.A.';
 | ||
| $country->save();
 | ||
| ```
 | ||
| 
 | ||
| > Info: Active Record є потужним засобом для доступу і управління даними бази даних в обʼєктно-орієнтованому стилі.
 | ||
| Ви можете знайти більш детальну інформацію в розділі [Active Record](db-active-record.md). Крім того, ви також можете
 | ||
| взаємодіяти з базою даних, використовуючи для доступу метод передачі даних нижнього рівня під назвою [Data Access Objects](db-dao.md).
 | ||
| 
 | ||
| 
 | ||
| Створення дії <span id="creating-action"></span>
 | ||
| -------------
 | ||
| 
 | ||
| Щоб відобразити дані про країну кінцевим користувачам, необхідно створити нову дію. Замість розміщення нової дії 
 | ||
| у контролері `site`, який ви використовували в попередніх розділах, є сенс створити новий контролер спеціально для всіх дій, 
 | ||
| пов’язаних з даними країн. Створіть новий контролер з іменем `CountryController` і дію `index`, як показано нижче:
 | ||
| 
 | ||
| ```php
 | ||
| <?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,
 | ||
|         ]);
 | ||
|     }
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| Збережіть цей код у файл `controllers/CountryController.php`.
 | ||
| 
 | ||
| Дія `index` викликає метод `Country::find()`. Цей метод Active Record будує запит до бази даних і отримує всі дані з таблиці `country`.
 | ||
| Щоб обмежити кількість країн, які будуть отримуватись в кожному запиті, сам запит розділяється на сторінки, за допомогою об’єкта
 | ||
| [[yii\data\Pagination]]. Об’єкт `Pagination` служить двом цілям:
 | ||
| 
 | ||
| * Встановлює директиви `offset` і `limit` для SQL-запиту так, щоб він повертав лише одну сторінку даних за один раз 
 | ||
|   (не більше 5 рядків на сторінці).
 | ||
| * Використовується у представленнях для відображення пейджера, який складається із переліку кнопок переходу по сторінках,
 | ||
|   про що буде описано у наступному підрозділі.
 | ||
| 
 | ||
| Наприкінці, дія `index` формує представлення з іменем `index` та передає до нього дані по країнах  із інформацією про посторінкове
 | ||
| розділення.
 | ||
| 
 | ||
| 
 | ||
| Створення представлення <span id="creating-view"></span>
 | ||
| -----------------------
 | ||
| 
 | ||
| В директорії `views` створіть спочатку під-директорію `country`. Цей каталог буде використовуватись для всіх
 | ||
| представлень контролера `country`. В директорії `views/country`, створіть файл з іменем `index.php`,
 | ||
| що містить наступне:
 | ||
| 
 | ||
| ```php
 | ||
| <?php
 | ||
| use yii\helpers\Html;
 | ||
| use yii\widgets\LinkPager;
 | ||
| ?>
 | ||
| <h1>Країни</h1>
 | ||
| <ul>
 | ||
| <?php foreach ($countries as $country): ?>
 | ||
|     <li>
 | ||
|         <?= Html::encode("{$country->name} ({$country->code})") ?>:
 | ||
|         <?= $country->population ?>
 | ||
|     </li>
 | ||
| <?php endforeach; ?>
 | ||
| </ul>
 | ||
| 
 | ||
| <?= LinkPager::widget(['pagination' => $pagination]) ?>
 | ||
| ```
 | ||
| 
 | ||
| Дане представлення містить дві секції для відображення даних про країни. У першій частині, відображаються передані дані про країни 
 | ||
| у вигляді невпорядкованого списку HTML. У другій частині, віджет [[yii\widgets\LinkPager]] з використанням інформації 
 | ||
| про нумерацію сторінок. Віджет `LinkPager` відображається у вигляді переліку кнопок. 
 | ||
| При натисканні на будь-якій з них будуть виводитись дані країн для відповідної сторінки.
 | ||
| 
 | ||
| 
 | ||
| Спробуємо <span id="trying-it-out"></span>
 | ||
| ---------
 | ||
| 
 | ||
| Щоб побачити як весь вищезазначений код працює, відкрийте в браузері наступний URL:
 | ||
| 
 | ||
| ```
 | ||
| http://hostname/index.php?r=country%2Findex
 | ||
| ```
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| Спочатку, ви побачите сторінку з переліком пʼяти країн. Нижче країн, ви побачите пейджер з чотирма кнопками. 
 | ||
| Якщо ви натиснете на кнопку "2", ви побачите сторінку з іншими пʼятьма країнами з бази даних: другу сторінку записів. 
 | ||
| Придивившись більш уважно, ви побачите, що URL в браузері також змінюється на
 | ||
| 
 | ||
| ```
 | ||
| http://hostname/index.php?r=country%2Findex&page=2
 | ||
| ```
 | ||
| 
 | ||
| За лаштунками, [[yii\data\Pagination|Pagination]] надає всю необхідну функціональність для розділення набору даних на сторінки:
 | ||
| 
 | ||
| * Спочатку, [[yii\data\Pagination|Pagination]] представляє першу сторінку, яка відображає країни запитом SELECT 
 | ||
|   з умовою `LIMIT 5 OFFSET 0`. В результаті, будуть відображені перші знайдені пʼять країн.
 | ||
| * Віджет [[yii\widgets\LinkPager|LinkPager]] відображає кнопки сторінок з URL-адресами створеними за допомогою 
 | ||
|   [[yii\data\Pagination::createUrl()|Pagination]]. URL-адреси будуть містити параметр запиту `page`, 
 | ||
|   який представляє різні номери сторінок.
 | ||
| * Якщо натиснути кнопку "2", новий запит для маршруту `country/index` спрацьовує і обробляється.
 | ||
|   [[yii\data\Pagination|Pagination]] зчитає параметр `page` з URL-запиту і встановить для поточної сторінки номер 2.
 | ||
|   Таким чином, новий запит до БД буде мати умову `LIMIT 5 OFFSET 5` і поверне наступні пʼять країн для відображення.
 | ||
| 
 | ||
| 
 | ||
| Підсумок <span id="summary"></span>
 | ||
| --------
 | ||
| 
 | ||
| В цьому розділі ви дізналися, як працювати з базою даних. Ви також дізналися, як вибирати і відображати дані на сторінках 
 | ||
| за допомогою [[yii\data\Pagination]] і [[yii\widgets\LinkPager]].
 | ||
| 
 | ||
| У наступному розділі ви дізнаєтеся, як використовувати потужний інструмент генерування коду, що називається [Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-uk/README.md), 
 | ||
| який допоможе вам швидко створювати деякі часто необхідні функції, такі як Create-Read-Update-Delete (CRUD) 
 | ||
| операції для роботи з даними в таблицях баз даних. Насправді, код, який ви щойно написали,
 | ||
| в Yii можливо автоматично згенерувати за допомогою інструменту Gii.
 |