Yii2. Работа с базой данных
16.03.2019
Теги: PHP • Web-разработка • Yii2 • БазаДанных • Запрос • Теория • Фреймворк
Для начала создадим базу данных под названием catalog
, из которой будем получать данные. В базу данных добавим две таблицы — category
и product
. И вставим в каждую таблицу несколько записей.
-- Таблица `category` CREATE TABLE `category` ( `id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Первичный ключ', `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT 'Родительская категория', `name` varchar(100) NOT NULL COMMENT 'Название категории', `sortorder` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Порядок сортировки' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `category` (`id`, `parent_id`, `name`, `sortorder`) VALUES (1, 0, 'Первая категория', 1), (2, 0, 'Вторая категория', 2), (3, 0, 'Третья категория', 3), (4, 0, 'Четвертая категрия', 4), (5, 1, 'Дочерняя категория', 1); -- Таблица `product` CREATE TABLE `product` ( `id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Первичный ключ', `category_id` int(11) NOT NULL DEFAULT '0' COMMENT 'Родительская категория', `name` varchar(200) NOT NULL COMMENT 'Название товара', `sortorder` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Порядок сортировки' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `product` (`id`, `category_id`, `name`, `sortorder`) VALUES (1, 1, 'Первый товар', 1), (2, 1, 'Второй товар', 2), (3, 2, 'Первый товар', 1), (4, 2, 'Второй товар', 2), (5, 5, 'Пятый товар', 1), (6, 5, 'Шестой товар', 2);
Далее нужно настроить подключение к базе данных. Для этого редактируем файл config/db.php
:
<?php return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=catalog', 'username' => 'db_user', 'password' => 'db_pass', 'charset' => 'utf8', ];
Теперь создаем модели:
<?php /* * Файл models/Category.php */ namespace app\models; use yii\db\ActiveRecord; class Category extends ActiveRecord { }
<?php /* * Файл models/Product.php */ namespace app\models; use yii\db\ActiveRecord; class Product extends ActiveRecord { }
Следующий шаг — создаем контроллер:
<?php namespace app\controllers; use yii\web\Controller; use app\models\Category; use app\models\Product; class CatalogController extends Controller { public function actionIndex() { // получаем корневые категории $categories = Category::find()->where(['parent_id' => 0])->all(); return $this->render('index', ['categories' => $categories]); } public function actionCategory() { // получаем информацию о категории с идентификатором 5 $category = Category::findOne(5); // получаем товары категории с идентификатором 5 $products = Product::find()->where(['category_id' => 5])->all(); return $this->render('category', ['category' => $category, 'products' => $products]); } public function actionProduct() { // получаем информацию о товаре с идентификатором 2 $product = Product::findOne(2); return $this->render('product', ['product' => $product]); } }
И последнее — файлы view-шаблонов в директории views/catalog
:
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'Каталог товаров'; ?> <div class="catalog-index"> <h1><?= Html::encode($this->title) ?></h1> <ul> <?php foreach ($categories as $category): ?> <li><?= $category->name; ?></li> <?php endforeach; ?> </ul> </div>
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = $category->name; ?> <div class="catalog-category"> <h1><?= Html::encode($category->name) ?></h1> <ul> <?php foreach ($products as $product): ?> <li><?= Html::encode($product->name); ?></li> <?php endforeach; ?> </ul> </div>
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = $product->name; ?> <div class="catalog-product"> <h1><?= Html::encode($product->name) ?></h1> </div>
Если имя таблицы базы данных не совпадает с названием класса модели, нужно в класс модели добавить метод tableName
:
<?php /* * Файл models/Category.php */ namespace app\models; use yii\db\ActiveRecord; class Category extends ActiveRecord { public static function tableName { return 'categories'; } }
<?php /* * Файл models/Product.php */ namespace app\models; use yii\db\ActiveRecord; class Product extends ActiveRecord { public static function tableName { return 'products'; } }
Дополнительно
- Официальный сайт Yii: Active Record
- Работа с запросами в Yii2. Часть 1
- Работа с запросами в Yii2. Часть 2
- Работа с запросами в Yii2. Часть 3
Поиск: PHP • Web-разработка • Yii2 • База данных • Фреймворк • Контроллер • Модель • Представление • ActiveRecord • Запрос