BMC IO DocsBMC IO Docs
IO v6
IO v7
Notes
Docs
IO v6
IO v7
Notes
Docs
  • IO Framework v7

    • О фреймворке
    • Что изменилось в 7 версии
    • Структура
    • Доступ к участкам проекта
    • Разворачивание нового проекта
  • Backend

    • Настройки проекта Conf.php
    • Настройки модуля Module.php
    • Настройки composer
    • Функции фреймворка
    • Глобальные переменные
    • Константы фреймворка
    • Event класс
    • IOCore класс
    • Route и работа с ними
    • Class и работа с ними
    • Api model и работа с ними
    • Template и работа с ними
    • Мультиязычность и словарь фраз
    • Bin скрипты и работа с ними
    • Cron скрипты и работа с ними
    • $ioSession и работа с сессией
    • $ioHash и работа с кешем
    • $iodb и работа с базой данных
  • Frontend

    • Twig шаблонизатор и работа с ним
    • Twig функции
    • Twig фильтры
    • Twig контекст
    • Настройка NPM
    • Сборка Frontend составляющей
    • Обращение к Api через JS

IO v7. Class и работа с ними

  • Описание
  • Содержимое файла
  • Сохранение изменений (создание, изменение) записи в базу данных
  • Операции с class
  • Методы, обязательные для объявления
    • tablename()
    • rules()
    • struct()
  • Методы, необязательные для объявления
    • convert_data_to_db()
    • convert_data_from_db()
    • Пользовательские методы
  • Доступные функции
    • get_primary_data()
    • get_sql_data()
    • get_updated_data()
    • search()
    • findItem()
    • getByPkid()
    • update()
    • save()
    • setDeleted()
    • setRestored()
    • delete()
    • is_new()
    • save_old_data()
    • set_data()
    • offsetGet()
    • offsetSet()
    • offsetExists()
    • offsetUnset()
    • get_field()
  • Property функции
    • pkid

Описание

Class - инструмент для управления записями в таблицах из базы данных.

В данной версии фреймворка в каждом проекте используется база данных MySQL.

В MySQL находятся:

  • данные cron планировщика.
  • кеш данные (если в качестве движка используется mysql).
  • даннные проекта.

Содержимое файла

Пример класса для работы с MySQL таблицей:

<?php

namespace App\Classes;

use IO\MySQL_Class;


class Example extends MySQL_Class
{
    /**
     * Разрешения на выполнение методов класса
     */
    public static function rules()
    {
        $arr = parent::rules();
        //$arr['static']['search'] = 1;
        //$arr['static']['findItem'] = 1;
        //$arr['static']['examplefn'] = 1;
        return $arr;
    }
    
    /**
     * Название таблицы в базе данных
     */
    public static function tablename()
    {
        return 'example';
    }
    
    /**
     * Структура таблицы
     */
    public static function struct()
    {
        return [
            'fields' => [
                
                /*
                type: - (string) тип поля
                - не указано (поле в бд)
                - property (динамическое поле, не записывается в базу)
                
                datatype: - (string) тип данных поля
                - int, integer, long
                - double, float, real
                - bool, boolean
                - string
                - nohtml
                - date
                - datetime
                - json
                
                default: - (mixed) значение по умолчанию
                
                func: - (string) функция динамического поля
                - не указано (по умолчанию)
                - pkid - генерация pkid для поля
                - пользовательская функция класса
                */
                
                'id' => [ // autoincrement from db
                    'datatype' => 'long',
                ],
                'pkid' => [ // autoincrement from function pkid()
                    'func' => 'pkid',
                    'datatype' => 'long',
                ],
                'company_pkid' => [
                    'datatype' => 'long',
                ],
                
                'typeInt' => [
                    'datatype' => 'int',
                    'default' => 0,
                ],
                'typeLong' => [
                    'datatype' => 'long',
                    'default' => 0,
                ],
                'typeDouble' => [
                    'datatype' => 'double',
                    'default' => 0,
                ],
                'typeBool' => [
                    'datatype' => 'boolean',
                    'default' => false,
                ],
                'typeString' => [
                    'datatype' => 'string',
                ],
                'typeDate' => [
                    'datatype' => 'date',
                ],
                'typeProperty1' => [ // value from function property1()
                    'datatype' => 'long',
                    'func' => 'property1',
                ],
                'typeProperty2' => [ // value from function property2()
                    'datatype' => 'long',
                    'func' => 'property2',
                ],
                'typeJson' => [
                    'datatype' => 'json',
                ],
                
                
                'isDeleted' => [
                    'datatype' => 'boolean',
                ],
                'gmtimeAdd' => [ // value from function gmtimeAdd()
                    'datatype' => 'nohtml',
                    //'func' => 'gmtimeAdd',
                ],
                'gmtimeChange' => [ // value from function gmtimeChange()
                    'datatype' => 'nohtml',
                    //'func' => 'gmtimeChange',
                ],
                'ugmtimeAdd' => [
                    'datatype' => 'long',
                ],
                'ugmtimeChange' => [
                    'datatype' => 'long',
                ],
            ],
            'primary' => [
                //0 => 'id',
                0 => 'pkid',
            ],
        ];
    }
    
    // custom property function
    public function property1($method, $key, $value)
    {
        if($method == 'set')
        {
            if(!isset($this->__data[$key])) $this->__data[$key] = $value;
            else $this->__data[$key] += $value;
        }
        elseif($method == 'get')
        {
            // Ничего не делаем, пусть значение будет то же
        }
    }
    
    // custom property function
    public function property2($method, $key, $value)
    {
        if($method == 'set')
        {
            // Ничего не делаем, пусть значение будет то же
        }
        elseif($method == 'get')
        {
            $this->__data[$key] = $this->typeProperty1 * 2;
        }
    }
    
    // custom function
    public static function examplefn($params)
    {
        return [
            'hello' => $params,
        ];
    }
    
    // example redeclare function save (insert or update)
    public function save($params = null)
    {
        return parent::save($params);
    }
    
    // example redeclare function delete
    public function delete($params = null)
    {
        return parent::delete($params);
    }
    
    // example redeclare function setDeleted
    public function setDeleted($params = null)
    {
        return parent::setDeleted($params);
    }
    
    // example redeclare function setRestored
    public function setRestored($params = null)
    {
        return parent::setRestored($params);
    }
}

Сохранение изменений (создание, изменение) записи в базу данных

// обращение к классу
// по старому
$c = \IO\IOCore::instance('app.class.example');
// или по новому
$c = new \App\Classes\Example();

// передача значений в переменные
$c->param_string = 'i am a string param';
$c->param_nohtml = 'i am a nohtml param';
$c->param_long = 123456;
$c->param_array = [ // для mongodb коллекции
    'hello' => 'world',
    'foo' => 'bar',
];

// вызов функции сохранения изменений
$c->save();

Операции с class

// получение записей
$r = \IO\IOCore::call(
    'app.class.example.search',
    [
        'filter' => [ // []
            'pkid' => 1,
            'isDeleted' => false,
        ],
        'start' => 0, // 0
        'limit' => 25, // null
        'join' => [], // null
        'fields' => [], // null
        'groupby' => [], // null
        'distinct' => false, // false
        'calc_found_rows' => false, // false
        'order' => [], // null
        'out' => 'array', // object
    ]
);
$count = xarr($r, 'count', 0);
$res = xarr($r, 'res', []);
$time = xarr($r, 'time', 0);

foreach($res as $obj)
{
    v2_dump($obj);
}
// получение записи
$obj = \IO\IOCore::call(
    'app.class.example.findItem',
    [
        'filter' => [ // []
            'pkid' => 1,
            'isDeleted' => false,
        ],
        'start' => 0, // 0
        'limit' => 25, // null
        'join' => [], // null
        'fields' => [], // null
        'groupby' => [], // null
        'distinct' => false, // false
        'calc_found_rows' => false, // false
        'order' => [], // null
        'out' => 'array', // object
    ]
);
v_dump($obj);
// добавление/изменение записи
$bj->param_string = 'hi garden!';
$obj->save();
// удаление записи
$obj->delete();
// пометить запись как удаленную
$obj->setDeleted();
// снять отметку с записи как удаленную
$obj->setRestored();

Методы, обязательные для объявления

tablename()

Возращает имя таблицы базы данных.

static tablename()

Пример:

/**
 * Название таблицы в базе данных
 */
public static function tablename()
{
    return 'lib_units';
}

rules()

Разрешения на выполнение методов класса.

static rules()

Пример:

/**
 * Разрешения на выполнение методов класса
 */
public static function rules()
{
    $arr = parent::rules();
    $arr['static']['hello'] = 1;
    $arr['static']['search'] = 1;
    $arr['static']['findItem'] = 1;
    return $arr;
}

struct()

Структура таблицы.

static struct()

Пример:

/**
 * Структура таблицы
 */
public static function struct()
{
    return [
        'fields' => [
            'id' => [
                'datatype' => 'bigint',
                'func' => 'pkid',
            ],
            'name' => [
                'datatype' => 'string',
                'label' => 'name',
            ],
            'value' => [
                'datatype' => 'string',
                'label' => 'value',
            ],
            /*'meta' => [
                'datatype' => 'json',
            ],
            'is_deleted' => [
                'datatype' => 'boolean',
            ],
            'gmtimeAdd' => [
                'datatype' => 'nohtml',
            ],
            'gmtimeChange' => [
                'datatype' => 'nohtml',
            ],*/
        ],
        'auto_increment' => true,
        'primary' => [
            'id',
        ],
    ];
}

Методы, необязательные для объявления

convert_data_to_db()

Конвертация данных в базу.

static convert_data_to_db(array $data, $is_new)

Пример:

/**
 * Конвертация данных в базу
 */
public static function convert_data_to_db($data, $is_new)
{
    $data['meta'] = json_encode($data['meta']);
    return $data;
}

convert_data_from_db()

Конвертация данных из базы.

static convert_data_from_db(array $data)

Пример:

/**
 * Конвертация данных из базы
 */
public static function convert_data_from_db($data)
{
    $data['meta'] = @json_decode($data['meta'], true);
    return $data;
}

Пользовательские методы

В классе можно добавлять пользовательские методы.

Чтобы методы можно было вызывать через конструкцию IOCore::call(), у них может быть только один аргумент функции array $params = []

Пример:

/**
 * Пользовательская функция
 */
public static function hello($params = [])
{
    return [
        'ppp' => $params,
    ];
}

Доступные функции

get_primary_data()

Вернуть данные первичного ключа.

get_primary_data()

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

get_sql_data()

Вернуть данные.

get_sql_data()

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

get_updated_data()

Вернуть данные, которые были изменены.

get_updated_data()

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

search()

Поиск записей по таблице.

В IO6 функция называлась dbsearch2.

static search(array $params): array

ВНИМАНИЕ

Вызов через \IO\IOCore::call() возможен.

Параметры функции:

  • filter
  • start
  • limit
  • join
  • fields
  • groupby
  • distinct
  • calc_found_rows
  • order
  • out

Параметр filter

Массив параметров фильтра.

В фильтре можно указывать операторы сравнения. Они указываются в ключе фильтра в качестве префикса:

  • = - равно (по умолчанию)
  • != - не равно
  • > - больше
  • >= - больше или равно
  • < - меньше
  • <= - меньше или равно
  • ~ - is null
  • !~ - is not null
  • % - содержит

Пример:

[
    'filter' => [
        '%text' => 'hel',
        "trade_types.pkid" => $types_pkid,
        "trade_params_types.param_type" => 1,
    ],
]

Также можно разделять фильтр на or и and.

Пример:

[
    'filter' => [
        '$or' => [
            [
                '%text' => 'hel',
            ],
            [
                '%text' => 'lo',
            ],
        ],
    ],
]

Параметр start

Позиция поиска (по умолчанию 0).

[
    'start' => 0,
    'start' => 25,
]

Параметр limit

Лимит записей (по умолчанию 1000).

Пример:

[
    'limit' => 25,
    'limit' => null,
]

Параметр join

Пример:

[
    'join' => [
        'inner join trade_params_types on (trade_params_types.type_pkid = trade_types.pkid)',
        'inner join trade_params on (trade_params_types.param_pkid = trade_params.pkid)',
    ],
]

Параметр fields

Пример:

[
    'fields' => [
        '#trade_types.pkid as type_pkid',
        '#trade_params_types.param_pkid as param_pkid',
        '#trade_params.meta as meta',
        '#trade_params.type as type',
    ],
]

Параметр groupby

Пример:

[
    'groupby' => [
        'pkid',
        'text',
    ],
]

Параметр distinct

Пример:

[
    'distinct' => true,
]

Параметр calc_found_rows

Пример:

[
    'calc_found_rows' => true,
]

Параметр order

Массив параметров сортировки, где ключ - это сортируемое поле, значение - asc (по возрастанию), desc (по убыванию).

Пример:

[
    'order' => [
        'pkid' => 'asc',
        'text' => 'desc',
    ],
]

Параметр out

Тип возвращаемых данных.

Есть 2 значения этого поля:

  • array - записи в виде массива (работает как в локальном проекте так и через "общалку").
  • object - записи в виде объекта экземпляра класса (работает только в локальном проекте) (по умолчанию).
  • pdo - результат запроса в формате PDO объекта.
[
    'out' => 'array',
]

findItem()

Поиск записи по таблице.

static findItem(array $params): array|object

Параметры функции аналогичны функции search()

ВНИМАНИЕ

Вызов через \IO\IOCore::call() возможен.

getByPkid()

Получение данных по их pkid.

static getByPkid(array $pkids, string $out = 'object'): array

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

update()

Изменение данных.

static update(array $filter, array $data): boolean

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

save()

Сохранение модели в базе.

save(array|null $params = null)

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

setDeleted()

Пометить запись на удаление.

setDeleted(array|null $params = null)

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

setRestored()

Восстановить запись из удаленных.

setRestored(array|null $params = null)

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

delete()

Физическое удаление записи.

delete(array|null $params = null)

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

is_new()

Возвращает true, если данные новые и не были прочитаны из MySQL.

is_new()

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

save_old_data()

Сохранить старые данные.

save_old_data()

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

set_data()

Установить данные.

set_data(array $data)

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

offsetGet()

Прочитать значение по ключу.

offsetGet(string $key)

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

offsetSet()

Установить значение по ключу.

offsetSet(string $key, mixed $value)

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

offsetExists()

offsetExists(string $key)

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

offsetUnset()

offsetUnset(string $key)

ВНИМАНИЕ

Вызов через \IO\IOCore::call() невозможен.

get_field()

Прочитать значение по ключу.

get_field(string $key)

Property функции

pkid

Функция генерации pkid.

Prev
Route и работа с ними
Next
Api model и работа с ними