IO v7. Class и работа с ними
Описание
Class - инструмент для управления записями в таблицах из базы данных.
В данной версии фреймворка в каждом проекте используется база данных MySQL.
В 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() возможен.
Параметры функции:
filterstartlimitjoinfieldsgroupbydistinctcalc_found_rowsorderout
Параметр 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.