MapperORM

Package framework.engine.orm
Inheritance class MapperORM » Mapper » LsObject
Since 1.0
Source Code /framework/classes/engine/MapperORM.class.php
Системный класс мапера ORM для работы с БД

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
_aBehaviors Список поведений в виде готовых объектов, формируется автоматически LsObject
aBehaviors array Список поведений LsObject
oDb DbSimple_Database Объект подключения к базе данных Mapper

Public Methods

Hide inherited methods

MethodDescriptionDefined By
AddBehaviorHook() Добавляет хук поведения LsObject
AddEntity() Добавление сущности в БД MapperORM
AttachBehavior() Присоединяет поведение к объекту LsObject
BuildFilter() Построение фильтра MapperORM
BuildFilterMore() Построение дополнительного фильтра MapperORM
DeleteEntity() Удаление сущности MapperORM
DetachBehavior() Отсоединяет поведение от объекта LsObject
GetAggregateFunctionByFilter() Получение сущности по фильтру MapperORM
GetBehavior() Возвращает объект поведения по его имени LsObject
GetBehaviors() Возвращает все объекты поведения LsObject
GetByFilter() Получение сущности по фильтру MapperORM
GetCountItemsByFilter() Получение числа сущностей по фильтру MapperORM
GetCountItemsByJoinEntity() MapperORM
GetItemsByFilter() Получение списка сущностей по фильтру MapperORM
GetItemsByJoinEntity() MapperORM
GetTableName() Возвращает имя таблицы для сущности MapperORM
RemoveBehaviorHook() Удаляет хук поведения LsObject
RunBehaviorHook() Запускает хук поведения на выполнение LsObject
ShowColumnsFrom() Список колонок/полей сущности MapperORM
ShowColumnsFromTable() Список колонок/полей таблицы MapperORM
ShowPrimaryIndexFrom() Primary индекс сущности MapperORM
ShowPrimaryIndexFromTable() Primary индекс таблицы MapperORM
UpdateEntity() Обновление сущности MapperORM
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля LsObject
__clone() При клонировании сбрасываем поведения LsObject
__construct() Передаем коннект к БД Mapper
__get() Обработка доступа к объекты поведения LsObject

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
IsSuccessful() Mapper
PrepareBehaviors() Инициализация поведений LsObject

Method Details

AddEntity() method
public int|bool AddEntity(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} int|bool Если есть primary индекс с автоинкрементом, то возвращает его для новой записи
Source Code: /framework/classes/engine/MapperORM.class.php#36 (show)
public function AddEntity($oEntity)
{
    
$sTableName self::GetTableName($oEntity);

    
$sql "INSERT INTO " $sTableName " SET ?a ";
    return 
$this->oDb->query($sql$oEntity->_getDataFields());
}

Добавление сущности в БД

BuildFilter() method
public array BuildFilter(array $aFilter, EntityORM $oEntitySample)
$aFilter array Фильтр
$oEntitySample EntityORM Объект сущности
{return} array
Source Code: /framework/classes/engine/MapperORM.class.php#364 (show)
public function BuildFilter($aFilter$oEntitySample)
{
    
$aFilterFields = array();
    foreach (
$aFilter as $k => $v) {
        if (
substr($k01) == '#' || (is_string($v) && substr($v01) == '#')) {

        } else {
            
$aFilterFields[$oEntitySample->_getField($k)] = $v;
        }
    }

    
$sFilterFields '';
    foreach (
$aFilterFields as $k => $v) {
        
$aK explode(' 'trim($k));
        
$sFieldCurrent $aK[0];
        
$sConditionCurrent ' = ';
        if (
count($aK) > 1) {
            
$sConditionCurrent strtolower($aK[1]);
        }
        
/**
         * У поля уже может быть указан префикс таблицы, поэтому делаем проверку
         */
        
if (!strpos($sFieldCurrent'.')) {
            
$sFieldCurrent 't.' $this->oDb->escape($sFieldCurrenttrue);
        }
        if (
strtolower($sConditionCurrent) == 'in') {
            
$sFilterFields .= " and {$sFieldCurrent} {$sConditionCurrent} ( ?a ) ";
        } else {
            
$sFilterFields .= " and {$sFieldCurrent} {$sConditionCurrent} ? ";
        }
    }
    if (isset(
$aFilter['#where']) and is_array($aFilter['#where'])) {
        
// '#where' => array('t.id = ?d OR t.name = ?' => array(1,'admin'));
        
foreach ($aFilter['#where'] as $sFilterKey => $aValues) {
            
$aFilterFields array_merge($aFilterFields$aValues);
            
$sFilterFields .= ' and ' trim($sFilterKey) . ' ';
        }
    }
    
/**
     * Формируем JOIN запрос
     */
    
$sJoinTables '';
    if (isset(
$aFilter['#join']) and is_array($aFilter['#join'])) {
        
$aValuesForMerge = array();
        foreach (
$aFilter['#join'] as $sJoin => $aValues) {
            if (
is_int($sJoin)) {
                
$sJoinTables .= ' ' $aValues ' ';
            } else {
                
$sJoinTables .= ' ' $sJoin ' ';
                
$aValuesForMerge array_merge($aValuesForMerge$aValues);
            }
        }
        
$aFilterFields array_merge($aValuesForMerge$aFilterFields);
    }
    return array(
$aFilterFields$sFilterFields$sJoinTables);
}

Построение фильтра

BuildFilterMore() method
public array BuildFilterMore(array $aFilter, EntityORM $oEntitySample)
$aFilter array Фильтр
$oEntitySample EntityORM Объект сущности
{return} array
Source Code: /framework/classes/engine/MapperORM.class.php#429 (show)
public function BuildFilterMore($aFilter$oEntitySample)
{
    
// Сортировка
    
$sOrder '';
    if (isset(
$aFilter['#order'])) {
        if (!
is_array($aFilter['#order'])) {
            
$aFilter['#order'] = array($aFilter['#order']);
        }
        foreach (
$aFilter['#order'] as $key => $value) {
            if (
is_numeric($key)) {
                
$key $value;
                
$value 'asc';
            } elseif (!
in_array($value, array('asc''desc'))) {
                
$value 'asc';
            }
            
/**
             * Проверяем на простые выражения: field1 + field2 * field3
             */
            
$aKeyPath preg_split("#\s?([\-\+\*\\\])\s?#"$key, -1PREG_SPLIT_DELIM_CAPTURE);
            if (
count($aKeyPath) > 2) {
                
$key '';
                foreach (
$aKeyPath as $i => $sKey) {
                    if (
$i == 0) {
                        
$key .= 't.' $this->oDb->escape($oEntitySample->_getField(trim($sKey)), true);
                    } else {
                        
$key .= {$sKey} ";
                    }
                }
            } else {
                
/**
                 * Проверяем на FIELD:id -> FIELD(id,?a)
                 */
                
$aKeys explode(':'$key);
                if (
count($aKeys) == 2) {
                    if (
strtolower($aKeys[0]) == 'field' and is_array($aFilter['#order'][$key]) and count($aFilter['#order'][$key])) {
                        
$key 'FIELD(t.' $this->oDb->escape($oEntitySample->_getField(trim($aKeys[1])),
                                
true) . ',' join(','$aFilter['#order'][$key]) . ')';
                        
$value '';
                    } else {
                        
/**
                         * Неизвестное выражение
                         */
                        
continue;
                    }
                } else {
                    
/**
                     * Пропускаем экранирование функций
                     */
                    
if (!in_array($key, array('rand()'))) {
                        
/**
                         * Проверяем наличие префикса таблицы
                         */
                        
if (!strpos($oEntitySample->_getField($key), '.')) {
                            
$key 't.' $this->oDb->escape($oEntitySample->_getField($key), true);
                        } else {
                            
$key $oEntitySample->_getField($key);
                        }
                    }
                }
            }

            
$sOrder .= {$key} {$value},";
        }
        
$sOrder trim($sOrder',');
        if (
$sOrder != '') {
            
$sOrder "ORDER BY {$sOrder}";
        }
    }

    
// Постраничность
    
if (isset($aFilter['#page']) and is_array($aFilter['#page']) and count($aFilter['#page']) == 2) { // array(2,15) - 2 - page, 15 - count
        
$aFilter['#limit'] = array(($aFilter['#page'][0] - 1) * $aFilter['#page'][1], $aFilter['#page'][1]);
    }

    
// Лимит
    
$sLimit '';
    if (isset(
$aFilter['#limit'])) { // допустимы варианты: limit=10 , limit=array(10) , limit=array(10,15)
        
$aLimit $aFilter['#limit'];
        if (
is_numeric($aLimit)) {
            
$iBegin 0;
            
$iEnd $aLimit;
        } elseif (
is_array($aLimit)) {
            if (
count($aLimit) > 1) {
                
$iBegin $aLimit[0];
                
$iEnd $aLimit[1];
            } else {
                
$iBegin 0;
                
$iEnd $aLimit[0];
            }
        }
        
$sLimit "LIMIT {$iBegin}{$iEnd}";
    }

    
// Группировка
    
$sGroup '';
    if (isset(
$aFilter['#group'])) {
        if (!
is_array($aFilter['#group'])) {
            
$aFilter['#group'] = array($aFilter['#group']);
        }
        foreach (
$aFilter['#group'] as $sField) {
            
$sField $this->oDb->escape($oEntitySample->_getField($sField), true);
            
$sGroup .= " t.{$sField},";
        }
        
$sGroup trim($sGroup',');
        if (
$sGroup != '') {
            
$sGroup "GROUP BY {$sGroup}";
        }
    }

    
// Определение полей в select
    
$sSelect '';
    if (isset(
$aFilter['#select'])) {
        
// todo: добавить экранирование полей с учетом префикса таблицы
        
if (!is_array($aFilter['#select'])) {
            
$aFilter['#select'] = array($aFilter['#select']);
        }
        
$sSelect join(', '$aFilter['#select']);
    }
    return array(
$sOrder$sLimit$sGroup$sSelect);
}

Построение дополнительного фильтра Здесь учитываются ключи фильтра вида #*

DeleteEntity() method
public int|bool DeleteEntity(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} int|bool Возвращает число удаленных записей в БД
Source Code: /framework/classes/engine/MapperORM.class.php#84 (show)
public function DeleteEntity($oEntity)
{
    
$sTableName self::GetTableName($oEntity);

    if (
$aPrimaryKey $oEntity->_getPrimaryKey()) {
        
// Возможен составной ключ
        
if (!is_array($aPrimaryKey)) {
            
$aPrimaryKey = array($aPrimaryKey);
        }
        
$sWhere ' 1 = 1 ';
        foreach (
$aPrimaryKey as $sField) {
            
$sWhere .= ' and ' $this->oDb->escape($sField,
                    
true) . " = " $this->oDb->escape($oEntity->_getDataOne($sField));
        }
        
$sql "DELETE FROM " $sTableName " WHERE {$sWhere}";
        return 
$this->oDb->query($sql);
    } else {
        
$aOriginalData $oEntity->_getOriginalData();
        
$sWhere implode(' AND 'array_map(create_function(
            
'$k,$v,$oDb',
            
'return "{$oDb->escape($k,true)} = {$oDb->escape($v)}";'
        
), array_keys($aOriginalData), array_values($aOriginalData),
        
array_fill(0count($aOriginalData), $this->oDb)));
        
$sql "DELETE FROM " $sTableName " WHERE 1=1 AND " $sWhere;
        return 
$this->oDb->query($sql);
    }
}

Удаление сущности

GetAggregateFunctionByFilter() method
public EntityORM|null GetAggregateFunctionByFilter(string $sAggregateFunction, string $sField, array $aFilter, string $sEntityFull)
$sAggregateFunction string Агрегирующая функция ('max','min','sum','avg')
$sField string Поля к оторому применяем агрегирующую функцию
$aFilter array Фильтр
$sEntityFull string Название класса сущности
{return} EntityORM|null
Source Code: /framework/classes/engine/MapperORM.class.php#151 (show)
public function GetAggregateFunctionByFilter($sAggregateFunction$sField$aFilter$sEntityFull)
{
    
$oEntitySample Engine::GetEntity($sEntityFull);
    
$sTableName self::GetTableName($sEntityFull);

    list(
$aFilterFields$sFilterFields$sJoinTables) = $this->BuildFilter($aFilter$oEntitySample);
    list(
$sOrder$sLimit$sGroup$sSelect) = $this->BuildFilterMore($aFilter$oEntitySample);

    
$sAggregateFunction strtolower($sAggregateFunction);
    if (!
in_array($sAggregateFunction, array('max''min''sum''avg'))) {
        
$sAggregateFunction 'max';
    }

    
/**
     * Проверяем на отсутствие префикса таблицы у поля
     */
    
if (!strpos($sField'.')) {
        
$sField 't.' $this->oDb->escape($sFieldtrue);
    }

    
$sql "SELECT {$sAggregateFunction}({$sField}) as value FROM " $sTableName " t {$sJoinTables} WHERE 1=1 {$sFilterFields} {$sGroup} ";
    
$aQueryParams array_merge(array($sql), array_values($aFilterFields));

    if (
$aRow call_user_func_array(array($this->oDb'selectRow'), $aQueryParams)) {
        return 
$aRow['value'];
    }
    return 
null;
}

Получение сущности по фильтру

GetByFilter() method
public EntityORM|null GetByFilter(array $aFilter, string $sEntityFull)
$aFilter array Фильтр
$sEntityFull string Название класса сущности
{return} EntityORM|null
Source Code: /framework/classes/engine/MapperORM.class.php#119 (show)
public function GetByFilter($aFilter$sEntityFull)
{
    
$oEntitySample Engine::GetEntity($sEntityFull);
    
$sTableName self::GetTableName($sEntityFull);

    list(
$aFilterFields$sFilterFields$sJoinTables) = $this->BuildFilter($aFilter$oEntitySample);
    list(
$sOrder$sLimit$sGroup$sSelect) = $this->BuildFilterMore($aFilter$oEntitySample);

    if (!
$sSelect) {
        
$sSelect 't.*';
    }

    
$sql "SELECT {$sSelect} FROM " $sTableName " t {$sJoinTables} WHERE 1=1 {$sFilterFields} {$sGroup} {$sOrder} LIMIT 0,1";
    
$aQueryParams array_merge(array($sql), array_values($aFilterFields));

    if (
$aRow call_user_func_array(array($this->oDb'selectRow'), $aQueryParams)) {
        
$oEntity Engine::GetEntity($sEntityFull$aRow);
        
$oEntity->_SetIsNew(false);
        return 
$oEntity;
    }
    return 
null;
}

Получение сущности по фильтру

GetCountItemsByFilter() method
public int GetCountItemsByFilter(array $aFilter, string $sEntityFull)
$aFilter array Фильтр
$sEntityFull string Название класса сущности
{return} int
Source Code: /framework/classes/engine/MapperORM.class.php#219 (show)
public function GetCountItemsByFilter($aFilter$sEntityFull)
{
    
$oEntitySample Engine::GetEntity($sEntityFull);
    
$sTableName self::GetTableName($sEntityFull);

    list(
$aFilterFields$sFilterFields$sJoinTables) = $this->BuildFilter($aFilter$oEntitySample);
    list(
$sOrder$sLimit$sGroup) = $this->BuildFilterMore($aFilter$oEntitySample);

    if (
$sGroup) {
        
/**
         * Т.к. count меняет свою логику при наличии группировки
         */
        
$sql "SELECT SQL_CALC_FOUND_ROWS * FROM `" $sTableName "` t {$sJoinTables} WHERE 1=1 {$sFilterFields} {$sGroup} ";
    } else {
        
$sql "SELECT count(*) as c FROM " $sTableName " t {$sJoinTables} WHERE 1=1 {$sFilterFields} {$sGroup} ";
    }
    
$aQueryParams array_merge(array($sql), array_values($aFilterFields));
    if (
$aRow call_user_func_array(array($this->oDb'selectRow'), $aQueryParams)) {
        if (
$sGroup) {
            
$aRow $this->oDb->selectRow('SELECT FOUND_ROWS() as c;');
        }
        return 
$aRow['c'];
    }
    return 
0;
}

Получение числа сущностей по фильтру

GetCountItemsByJoinEntity() method
public void GetCountItemsByJoinEntity($sEntityJoin, $sKeyJoin, $sRelationKey, $aRelationValues, $aFilter, $sEntityFull)
$sEntityJoin
$sKeyJoin
$sRelationKey
$aRelationValues
$aFilter
$sEntityFull
Source Code: /framework/classes/engine/MapperORM.class.php#317 (show)
public function GetCountItemsByJoinEntity(
    
$sEntityJoin,
    
$sKeyJoin,
    
$sRelationKey,
    
$aRelationValues,
    
$aFilter,
    
$sEntityFull
) {
    
$oEntitySample Engine::GetEntity($sEntityFull);
    
$oEntityJoinSample Engine::GetEntity($sEntityJoin);
    
$sTableName self::GetTableName($sEntityFull);
    
$sTableJoinName self::GetTableName($sEntityJoin);

    
/**
     * Формируем параметры по таблице связей
     */
    
list($aFilterFields$sFilterFields) = $this->BuildFilter($aFilter$oEntityJoinSample);

    if (!
is_array($aRelationValues)) {
        
$aRelationValues = array($aRelationValues);
    }
    
/**
     * SQL и параметры
     */
    
$sql "SELECT count(*) as c FROM ?# t LEFT JOIN ?# b ON b.?# = t.?# WHERE t.?# in ( ?a ) {$sFilterFields} ";
    
$aQueryParams array_merge(array(
            
$sql,
            
$sTableJoinName,
            
$sTableName,
            
$oEntitySample->_getPrimaryKey(),
            
$sRelationKey,
            
$sKeyJoin,
            
$aRelationValues
        
), array_values($aFilterFields));
    if (
$aRow call_user_func_array(array($this->oDb'selectRow'), $aQueryParams)) {
        return 
$aRow['c'];
    }
    return 
0;
}

GetItemsByFilter() method
public array GetItemsByFilter(array $aFilter, string $sEntityFull)
$aFilter array Фильтр
$sEntityFull string Название класса сущности
{return} array
Source Code: /framework/classes/engine/MapperORM.class.php#187 (show)
public function GetItemsByFilter($aFilter$sEntityFull)
{
    
$oEntitySample Engine::GetEntity($sEntityFull);
    
$sTableName self::GetTableName($sEntityFull);

    list(
$aFilterFields$sFilterFields$sJoinTables) = $this->BuildFilter($aFilter$oEntitySample);
    list(
$sOrder$sLimit$sGroup$sSelect) = $this->BuildFilterMore($aFilter$oEntitySample);

    if (!
$sSelect) {
        
$sSelect 't.*';
    }

    
$sql "SELECT {$sSelect} FROM " $sTableName " t {$sJoinTables} WHERE 1=1 {$sFilterFields} {$sGroup} {$sOrder} {$sLimit} ";
    
$aQueryParams array_merge(array($sql), array_values($aFilterFields));
    
$aItems = array();
    if (
$aRows call_user_func_array(array($this->oDb'select'), $aQueryParams)) {
        foreach (
$aRows as $aRow) {
            
$oEntity Engine::GetEntity($sEntityFull$aRow);
            
$oEntity->_SetIsNew(false);
            
$aItems[] = $oEntity;
        }
    }
    return 
$aItems;
}

Получение списка сущностей по фильтру

GetItemsByJoinEntity() method
public void GetItemsByJoinEntity($sEntityJoin, $sKeyJoin, $sRelationKey, $aRelationValues, $aFilter, $sEntityFull)
$sEntityJoin
$sKeyJoin
$sRelationKey
$aRelationValues
$aFilter
$sEntityFull
Source Code: /framework/classes/engine/MapperORM.class.php#245 (show)
public function GetItemsByJoinEntity(
    
$sEntityJoin,
    
$sKeyJoin,
    
$sRelationKey,
    
$aRelationValues,
    
$aFilter,
    
$sEntityFull
) {
    
$oEntitySample Engine::GetEntity($sEntityFull);
    
$oEntityJoinSample Engine::GetEntity($sEntityJoin);
    
$sTableName self::GetTableName($sEntityFull);
    
$sTableJoinName self::GetTableName($sEntityJoin);

    
/**
     * Формируем параметры по таблице связей
     */
    
list($aFilterFields$sFilterFields) = $this->BuildFilter($aFilter$oEntityJoinSample);
    list(
$sOrder$sLimit) = $this->BuildFilterMore($aFilter$oEntityJoinSample);
    
/**
     * Формируем список полей для возврата у таблице связей
     */
    
$aFieldsJoinReturn $oEntityJoinSample->_getFields();
    foreach (
$aFieldsJoinReturn as $k => $sField) {
        if (!
is_numeric($k)) {
            
// Удаляем служебные (примари) поля
            
unset($aFieldsJoinReturn[$k]);
            continue;
        }
        
$aFieldsJoinReturn[$k] = "t.`{$sField}` as t_join_{$sField}";
    }
    
$sFieldsJoinReturn join(', '$aFieldsJoinReturn);

    if (!
is_array($aRelationValues)) {
        
$aRelationValues = array($aRelationValues);
    }
    
/**
     * SQL и параметры
     */
    
$sql "SELECT {$sFieldsJoinReturn}, b.* FROM ?# t LEFT JOIN ?# b ON b.?# = t.?# WHERE t.?# in ( ?a ) {$sFilterFields} {$sOrder} {$sLimit}";
    
$aQueryParams array_merge(array(
            
$sql,
            
$sTableJoinName,
            
$sTableName,
            
$oEntitySample->_getPrimaryKey(),
            
$sRelationKey,
            
$sKeyJoin,
            
$aRelationValues
        
), array_values($aFilterFields));
    
$aItems = array();
    
/**
     * Выполняем запрос
     */
    
if ($aRows call_user_func_array(array($this->oDb'select'), $aQueryParams)) {
        foreach (
$aRows as $aRow) {
            
$aData = array();
            
$aDataRelation = array();
            foreach (
$aRow as $k => $v) {
                if (
strpos($k't_join_') === 0) {
                    
$aDataRelation[str_replace('t_join_'''$k)] = $v;
                } else {
                    
$aData[$k] = $v;
                }
            }
            
$aData['_relation_entity'] = Engine::GetEntity($sEntityJoin$aDataRelation);
            
$oEntity Engine::GetEntity($sEntityFull$aData);
            
$oEntity->_SetIsNew(false);
            
$aItems[] = $oEntity;
        }
    }
    return 
$aItems;
}

GetTableName() method
public static string GetTableName(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} string
Source Code: /framework/classes/engine/MapperORM.class.php#632 (show)
public static function GetTableName($oEntity)
{
    
/**
     * Варианты таблиц:
     *    prefix_user -> если модуль совпадает с сущностью
     *    prefix_user_invite -> если модуль не сопадает с сущностью
     * Если сущность плагина:
     *    prefix_pluginname_user
     *    prefix_pluginname_user_invite
     */
    
$sClass Engine::getInstance()->Plugin_GetDelegater('entity',
        
is_object($oEntity) ? get_class($oEntity) : $oEntity);
    
$sPluginName func_underscore(Engine::GetPluginName($sClass));
    
$sModuleName func_underscore(Engine::GetModuleName($sClass));
    
$sEntityName func_underscore(Engine::GetEntityName($sClass));
    if (
strpos($sEntityName$sModuleName) === 0) {
        
$sTable func_underscore($sEntityName);
    } else {
        
$sTable func_underscore($sModuleName) . '_' func_underscore($sEntityName);
    }
    if (
$sPluginName) {
        
$sTablePlugin $sPluginName '_' $sTable;
        
/**
         * Для обратной совместимости с 1.0.1
         * Если такая таблица определена в конфиге, то ок, если нет, то используем старый вариант без имени плагина
         */
        
if (Config::Get('db.table.' $sTablePlugin)) {
            
$sTable $sTablePlugin;
        }
    }
    
/**
     * Если название таблиц переопределено в конфиге, то возвращаем его
     */
    
if (Config::Get('db.table.' $sTable)) {
        return 
Config::Get('db.table.' $sTable);
    } else {
        return 
Config::Get('db.table.prefix') . $sTable;
    }
}

Возвращает имя таблицы для сущности

ShowColumnsFrom() method
public array ShowColumnsFrom(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} array
Source Code: /framework/classes/engine/MapperORM.class.php#556 (show)
public function ShowColumnsFrom($oEntity)
{
    
$sTableName self::GetTableName($oEntity);
    return 
$this->ShowColumnsFromTable($sTableName);
}

Список колонок/полей сущности

ShowColumnsFromTable() method
public array ShowColumnsFromTable(string $sTableName)
$sTableName string Название таблицы
{return} array
Source Code: /framework/classes/engine/MapperORM.class.php#568 (show)
public function ShowColumnsFromTable($sTableName)
{
    if (
false === ($aItems Engine::getInstance()->Cache_Get("columns_table_{$sTableName}"'file_orm'true,
            
true))
    ) {
        
$sql "SHOW COLUMNS FROM " $sTableName;
        
$aItems = array();
        if (
$aRows $this->oDb->select($sql)) {
            foreach (
$aRows as $aRow) {
                
$aItems[] = $aRow['Field'];
                if (
$aRow['Key'] == 'PRI') {
                    
$aItems['#primary_key'] = $aRow['Field'];
                }
            }
        }
        
Engine::getInstance()->Cache_Set($aItems"columns_table_{$sTableName}", array(), 60 60 4'file_orm',
            
true);
    }
    return 
$aItems;
}

Список колонок/полей таблицы

ShowPrimaryIndexFrom() method
public array ShowPrimaryIndexFrom(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} array
Source Code: /framework/classes/engine/MapperORM.class.php#595 (show)
public function ShowPrimaryIndexFrom($oEntity)
{
    
$sTableName self::GetTableName($oEntity);
    return 
$this->ShowPrimaryIndexFromTable($sTableName);
}

Primary индекс сущности

ShowPrimaryIndexFromTable() method
public array ShowPrimaryIndexFromTable(string $sTableName)
$sTableName string Название таблицы
{return} array
Source Code: /framework/classes/engine/MapperORM.class.php#607 (show)
public function ShowPrimaryIndexFromTable($sTableName)
{
    if (
false === ($aItems Engine::getInstance()->Cache_Get("index_table_{$sTableName}"'file_orm'truetrue))
    ) {
        
$sql "SHOW INDEX FROM " $sTableName;
        
$aItems = array();
        if (
$aRows $this->oDb->select($sql)) {
            foreach (
$aRows as $aRow) {
                if (
$aRow['Key_name'] == 'PRIMARY') {
                    
$aItems[$aRow['Seq_in_index']] = $aRow['Column_name'];
                }
            }
        }
        
Engine::getInstance()->Cache_Set($aItems"index_table_{$sTableName}", array(), 60 60 4'file_orm',
            
true);
    }
    return 
$aItems;
}

Primary индекс таблицы

UpdateEntity() method
public int|bool UpdateEntity(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} int|bool Возвращает число измененых записей в БД
Source Code: /framework/classes/engine/MapperORM.class.php#50 (show)
public function UpdateEntity($oEntity)
{
    
$sTableName self::GetTableName($oEntity);

    if (
$aPrimaryKey $oEntity->_getPrimaryKey()) {
        
// Возможен составной ключ
        
if (!is_array($aPrimaryKey)) {
            
$aPrimaryKey = array($aPrimaryKey);
        }
        
$sWhere ' 1 = 1 ';
        foreach (
$aPrimaryKey as $sField) {
            
$sWhere .= ' and ' $this->oDb->escape($sField,
                    
true) . " = " $this->oDb->escape($oEntity->_getDataOne($sField));
        }
        
$sql "UPDATE " $sTableName " SET ?a WHERE {$sWhere}";
        return 
$this->oDb->query($sql$oEntity->_getDataFields());
    } else {
        
$aOriginalData $oEntity->_getOriginalData();
        
$sWhere implode(' AND 'array_map(create_function(
            
'$k,$v,$oDb',
            
'return "{$oDb->escape($k,true)} = {$oDb->escape($v)}";'
        
), array_keys($aOriginalData), array_values($aOriginalData),
        
array_fill(0count($aOriginalData), $this->oDb)));
        
$sql "UPDATE " $sTableName " SET ?a WHERE 1=1 AND " $sWhere;
        return 
$this->oDb->query($sql$oEntity->_getDataFields());
    }
}

Обновление сущности