Yii2. Работа с базой данных

16.03.2019

Теги: PHPWeb-разработка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';
    }
}

Дополнительно

Поиск: PHP • Web-разработка • Yii2 • База данных • Фреймворк • Контроллер • Модель • Представление • ActiveRecord • Запрос

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.