Новости

Перше знайомство: Робота з базами даних

  1. Готуємо базу даних ¶
  2. Налаштовуємо підключення до БД ¶
  3. Створюємо нащадка Active Record ¶
  4. створюємо Action ¶
  5. створюємо View ¶
  6. Відчуваємо в дії ¶
  7. висновок ¶

Цей розділ розповість про те, як створити нову сторінку, яка буде показувати дані по країнам, отримані з таблиці countries бази даних. Для досягнення цієї мети вам буде необхідно налаштувати підключення до бази даних, створити клас Active Record , визначити action і створити view .

Вивчивши цю частину, ви навчитеся:

  • Налаштовувати підключення до БД.
  • Визначати клас Active Record.
  • Запитувати дані, використовуючи клас Active Record.
  • Відображення всіх відомостей у view з використанням пагінацію.

Зверніть увагу, щоб засвоїти цей розділ, ви повинні мати базові знання та навички використання баз даних. Зокрема, ви повинні знати, як створити базу даних і як виконувати SQL запити, використовуючи клієнтські інструменти для роботи з БД.

Готуємо базу даних

Для початку створіть базу даних під назвою yii2basic, з якої ви будете отримувати дані в вашому додатку. Ви можете створити базу даних SQLite, MySQL, PostgreSQL, MSSQL або Oracle, так як Yii має вбудовану підтримку для багатьох баз даних. Для простоти, в подальшому описі буде матися на увазі MySQL.

Після цього створіть в базі даних таблицю country і додайте в неї трохи демонстраційних даних. Ви можете запустити наступну 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 з трьома стовпцями, що містять десять рядків даних.

Налаштовуємо підключення до БД

Перед продовженням переконайтеся, що у вас встановлені PHP-розширення PDO і драйвер PDO для використовуваної вами бази даних (наприклад, pdo_mysql для MySQL). Це базова вимога в разі використання вашим додатком реляційної бази даних. Після того, як вони встановлені, відкрийте файл config / db.php і змініть параметри на вірні для вашої бази даних. За замовчуванням цей файл містить наступне:

<? Php return [ 'class' => 'yii \ db \ Connection', 'dsn' => 'mysql: host = localhost; dbname = yii2basic', 'username' => 'root', 'password' => ' ',' charset '=>' utf8 ',];

Файл config / db.php - типовий конфігураційний інструмент, який базується на файлах. Даний конфігураційний файл визначає параметри, необхідні для створення і ініціалізації примірника yii \ db \ Connection , Через який ви можете робити SQL запити до якої мається на увазі базі даних.

Підключення до БД, налаштоване вище, є в коді програми через вираз Yii :: $ app-> db.

Інформація: файл config / db.php буде підключений головною конфігурацією додатка config / web.php, яка описує те, як екземпляр додатки слід буде почати. Для детальної інформації, будь ласка, зверніться до розділу конфігурації .

Якщо вам необхідно працювати з базами даних, підтримка яких не включена безпосередньо в фреймворк, варто звернути увагу на наступні розширення:

Створюємо нащадка Active Record

Щоб представляти і отримувати дані з таблиці country, створіть клас - нащадок Active Record , Під назвою Country і збережіть його у файлі models / Country.php.

<? Php namespace app \ models; use yii \ db \ ActiveRecord; class Country extends ActiveRecord {}

Клас Country успадковується від yii \ db \ ActiveRecord . Вам не потрібно писати жодного рядка коду всередині нього! З кодом, наведеним вище, Yii зв'яже ім'я таблиці з ім'ям класу.

Інформація: Якщо немає можливості поставити пряму залежність між ім'ям таблиці і ім'ям класу, ви можете перевизначити метод yii \ db \ ActiveRecord :: tableName () , Щоб явно задати ім'я пов'язаної таблиці.

Використовуючи клас Country, ви можете легко маніпулювати даними в таблиці country, як показано в цих фрагментах:

use app \ models \ Country; $ Countries = Country :: find () -> orderBy ( 'name') -> all (); $ Country = Country :: findOne ( 'US'); echo $ country -> name; $ Country -> name = 'USA'; $ Country -> save ();

Інформація: Active Record - потужний спосіб доступу і маніпулювання даними БД в об'єктно-орієнтованому стилі. Ви можете знайти детальну інформацію в розділі Active Record . В якості альтернативи, ви також можете взаємодіяти з базою даних, використовуючи більш низькорівневий спосіб доступу, званий Data Access Objects .

створюємо Action

Для того, щоб показати дані по країнам кінцевим користувачам, вам треба створити новий action. Замість розміщення нового action'a в контролері site, як ви робили в попередніх розділах, буде мати більше сенсу створити новий контролер спеціально для всіх дій, що відносяться до даних по країнам. Назвіть новий контролер CountryController, і створіть action index всередині нього, як показано нижче.

<? 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.

Action index викликає Country :: find (). Даний метод Active Record будує запит до БД і витягує всі дані з таблиці country. Щоб обмежити кількість країн, що повертаються кожним запитом, запит розбивається на сторінки за допомогою об'єкта yii \ data \ Pagination . Об'єкт Pagination служить двом цілям:

  • Встановлює пункти offset і limit для SQL інструкції, представленої запитом, щоб вона повертала тільки одну сторінку даних за раз (в нашому випадку максимум 5 рядків на сторінку).
  • Він використовується у view для відображення пагінатора, що складається з набору кнопок з номерами сторінок, це буде роз'яснено в наступному підрозділі.

В кінці коду action index виводить view з ім'ям index, і передає в нього дані по країнам разом c інформацією про пагінацію.

створюємо View

Насамперед створіть підтеку з ім'ям country всередині директорії views. Ця папка буде використовуватися для зберігання всіх view, виведених контролером country. Всередині директорії views / country створіть файл з ім'ям index.php, що містить наступний код:

&lt;? Php use yii \ helpers \ Html; use yii \ widgets \ LinkPager; ?> <H1> Countries </ h1> <ul> &lt;? Php foreach ($ countries as $ country):?> <Li> &lt;? = Html :: encode ( "{$ country-> code} ({$ country-> name})")?>: &lt;? = $ Country -> population?> </ Li> &lt;? Php endforeach; ?> </ Ul> &lt;? = LinkPager :: widget ([ 'pagination' => $ pagination])?>

View має 2 частини щодо відображення даних по країнам. У першій частині надані дані по країнам виводяться як невпорядкований HTML-список. У другій частині виводиться віджет yii \ widgets \ LinkPager , Використовуючи інформацію про пагінацію, передану з action у view. Віджет LinkPager відображає набір посторінкових кнопок. Клік по кожній із них оновить дані по країнам у відповідній сторінці.

Відчуваємо в дії

Щоб побачити, як працює весь вищенаведений код, перейдіть за наступним посиланням в своєму браузері:

http:

На початку ви побачите сторінку, яка показує п'ять країн. Під країнами ви побачите пагінатор з чотирма кнопками. Якщо ви клацніть на кнопці "2", то побачите сторінку, яка буде показувати інші п'ять країн з бази даних: друга сторінка записів. Подивившись уважніше, ви побачите, що URL в браузері теж змінилося на

http:

За кадром Pagination надає всю необхідну функціональність для посторінкового розбивки набору даних:

  • На початку Pagination показує першу сторінку, яка відображає SELECT запит країн з параметрами LIMIT 5 OFFSET 0. Як результат, перші п'ять країн будуть отримані і відображені.
  • Віджет LinkPager виводить кнопки сторінок використовуючи URL'и, створені Pagination . Ці URL'и міститимуть параметр запиту page, який представляє різні номери сторінок.
  • Якщо ви клацніть на кнопці "2", спрацює і буде опрацьовано новий запит для маршруту country / index. Таким чином новий запит країн матиме параметри LIMIT 5 OFFSET 5 і поверне наступні п'ять країн для відображення.

висновок

У цьому розділі ви навчились працювати з базою даних. Також ви навчилися отримувати і відображати дані з посторінковою розбивкою за допомогою yii \ data \ Pagination і yii \ widgets \ LinkPager .

У наступному розділі ви навчитеся використовувати потужний інструмент генерації коду, званий Gii , Щоб з його допомогою швидко здійснювати деякі часто використовувані функції, такі як операції Create-Read-Update-Delete (CRUD) для роботи з даними в таблиці бази даних. Насправді код, який ви тільки що написали, в Yii може бути повністю згенерований автоматично з використанням Gii.

Lt;?
Lt;?
Php use yii \ helpers \ Html; use yii \ widgets \ LinkPager; ?
Php foreach ($ countries as $ country):?
Html :: encode ( "{$ country-> code} ({$ country-> name})")?
Country -> population?
Php endforeach; ?
LinkPager :: widget ([ 'pagination' => $ pagination])?

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: