/gg-test-yii2

Minimal code to realize storage for unlimited additional attibutes for any persistent entity

Primary LanguagePHP

Приложение GG Test Yii2

Добавление возможности бесконечного расширения списка атрибутов у хранимых сущностей

Минимальные требования

Установка

cd /var/www
git clone https://github.com/pvolyntsev/gg-test-yii2.git
cd gg-test-yii2
composer global require "fxp/composer-asset-plugin:~1.1.4"
composer install

Создание БД

DROP DATABASE IF EXISTS `gg_test_yii2`;
CREATE DATABASE IF NOT EXISTS `gg_test_yii2` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON gg_test_yii2.* TO gg_test_yii2_user@localhost IDENTIFIED BY '123456';

Параметры базы данных можно установить в файле config/db.php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=gg_test_yii2',
    'username' => 'gg_test_yii2_user',
    'password' => '123456',
    'charset' => 'utf8',
];

Загрузка моделей и начальных данных в СУБД

cd /var/www/gg-test-yii2
php yii migrate/up

Тесты

Реализованы только модульные тесты

vendor/bin/codecept run unit
Codeception PHP Testing Framework v2.3.5
Powered by PHPUnit 6.2.4 by Sebastian Bergmann and contributors.

Unit Tests (7) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
✔ PageEAVTes: Page by id (0.51s)
✔ PageEAVTes: Read extra attribute (0.11s)
✔ PageEAVTes: Write extra attribute (0.05s)
✔ PageEAVTes: Save extra attributes (0.25s)
✔ PageEAVTes: Remove extra attribute (0.09s)
✔ PageEAVTes: New entity with attributes (0.11s)
✔ PageEAVTes: Remove attributes when delete entity (0.09s)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Time: 5.18 seconds, Memory: 14.00MB

OK (7 tests, 30 assertions)

Использование

Используется только для хранимых классов, которые наследуюются от ActiveRecord.

Для включения такой возможности необходимо указать базовый класс \app\library\eav\BaseActiveRecord

Пример подключения:

CREATE TABLE `shop_item` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
<?php

class ShopItem extends \app\library\eav\BaseActiveRecord
{
    public static function tableName()
    {
        return 'shop_item';
    }

    public function rules()
    {
        return [
            [['name'], 'required'],
            [['name' => 255],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Name',
        ];
    }
}

Пример использования

<?php

$shopItem = new ShopItem; // или ShopItem::findOne(<id>)
$shopItem->name = 'Car'; // обращение к свойству name, хранящемуся в таблице `shop_item`
$shopItem->color = 'red'; // обращение к дополнительному свойству
unset($shopItem->color); // удаление дополнительного свойства

TODO

  • оформить как подключаемую компоненту
  • реализовать через Traits
  • реализовать разные типы данных для дополнительных атрибутов (сейчас только строки до 255 символов)
  • реализовать сложные типы данных для дополнительных атрибутов (хотелось бы хранить массивы)
  • добавить пример SQL для поиска записей по его атрибутам
  • (minor) при смене ID сущности обновлять атрибуты
  • добавить возможность работать с первичными ключами-строками (сейчас первичный ключ может быть только unsigned int(11))
  • (minor) добавить возможность работать с составными первичными ключами (сейчас только простой ключ)