MapperORM

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

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
oDb DbSimple_Generic_Database Объект подключения к базе данных Mapper

Public Methods

Hide inherited methods

MethodDescriptionDefined By
AddEntity() Добавление сущности в БД MapperORM
BuildFilter() Построение фильтра MapperORM
BuildFilterMore() Построение дополнительного фильтра MapperORM
DeleteEntity() Удаление сущности MapperORM
GetByFilter() Получение сущности по фильтру MapperORM
GetCountItemsByFilter() Получение числа сущностей по фильтру MapperORM
GetCountItemsByJoinTable() Получение числа сущностей по связанной таблице MapperORM
GetItemsByFilter() Получение списка сущностей по фильтру MapperORM
GetItemsByJoinTable() Получение сущностей по связанной таблице MapperORM
GetTableName() Возвращает имя таблицы для сущности MapperORM
ShowColumnsFrom() Список колонок/полей сущности MapperORM
ShowColumnsFromTable() Список колонок/полей таблицы MapperORM
ShowPrimaryIndexFrom() Primary индекс сущности MapperORM
ShowPrimaryIndexFromTable() Primary индекс таблицы MapperORM
UpdateEntity() Обновление сущности MapperORM
__construct() Передаем коннект к БД Mapper
deleteManyToManySet() Удаление связей many_to_many для объекта. Используется при удалении сущности, MapperORM
getManyToManySet() Загрузка данных из таблицы связи many_to_many MapperORM
updateManyToManySet() Обновление связи many_to_many MapperORM

Method Details

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

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

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

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

        } 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 (
strtolower($sConditionCurrent)=='in') {
            
$sFilterFields.=" and {$sFieldCurrent} {$sConditionCurrent} ( ?a ) ";
        } else {
            
$sFilterFields.=" and {$sFieldCurrent} {$sConditionCurrent} ? ";
        }
    }
    if (isset(
$aFilter['#where']) and is_array($aFilter['#where'])) {
        
// '#where' => array('id = ?d OR name = ?' => array(1,'admin'));
        
foreach ($aFilter['#where'] as $sFilterKey => $aValues) {
            
$aFilterFields array_merge($aFilterFields$aValues);
            
$sFilterFields .= ' and 'trim($sFilterKey) .' ';
        }
    }
    return array(
$aFilterFields,$sFilterFields);
}

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

BuildFilterMore() method
public array BuildFilterMore(array $aFilter, EntityORM $oEntitySample)
$aFilter array Фильтр
$oEntitySample EntityORM Объект сущности
{return} array
Source Code: /engine/classes/MapperORM.class.php#262 (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';
            }
            
$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}";
    }
    return array(
$sOrder,$sLimit);
}

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

DeleteEntity() method
public int|bool DeleteEntity(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} int|bool Возвращает число удаленных записей в БД
Source Code: /engine/classes/MapperORM.class.php#73 (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(0,count($aOriginalData),$this->oDb)));
        
$sql "DELETE FROM ".$sTableName." WHERE 1=1 AND "$sWhere;
        return 
$this->oDb->query($sql);
    }
}

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

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

    list(
$aFilterFields,$sFilterFields)=$this->BuildFilter($aFilter,$oEntitySample);

    
$sql "SELECT * FROM ".$sTableName." WHERE 1=1 {$sFilterFields}  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: /engine/classes/MapperORM.class.php#153 (show)
public function GetCountItemsByFilter($aFilter,$sEntityFull) {
    
$oEntitySample=Engine::GetEntity($sEntityFull);
    
$sTableName self::GetTableName($sEntityFull);

    list(
$aFilterFields,$sFilterFields)=$this->BuildFilter($aFilter,$oEntitySample);

    
$sql "SELECT count(*) as c FROM ".$sTableName." WHERE 1=1 {$sFilterFields} ";
    
$aQueryParams=array_merge(array($sql),array_values($aFilterFields));
    if(
$aRow=call_user_func_array(array($this->oDb,'selectRow'),$aQueryParams)) {
        return 
$aRow['c'];
    }
    return 
0;
}

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

GetCountItemsByJoinTable() method
public int GetCountItemsByJoinTable(array $aFilter, string $sEntityFull)
$aFilter array Фильтр
$sEntityFull string Название класса сущности
{return} int
Source Code: /engine/classes/MapperORM.class.php#202 (show)
public function GetCountItemsByJoinTable($aFilter,$sEntityFull) {
    
$oEntitySample=Engine::GetEntity($sEntityFull);
    list(
$aFilterFields,$sFilterFields)=$this->BuildFilter($aFilter,$oEntitySample);

    
$sql "SELECT count(*) as c FROM ?# a  WHERE a.?#=? {$sFilterFields}";
    
$aQueryParams=array_merge(array($sql,$aFilter['#join_table'],$aFilter['#by_key'],$aFilter['#by_value']),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: /engine/classes/MapperORM.class.php#127 (show)
public function GetItemsByFilter($aFilter,$sEntityFull) {
    
$oEntitySample=Engine::GetEntity($sEntityFull);
    
$sTableName self::GetTableName($sEntityFull);

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

    
$sql "SELECT * FROM ".$sTableName." WHERE 1=1 {$sFilterFields} {$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;
}

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

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

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

    
$sql "SELECT a.*, b.* FROM ?# a LEFT JOIN ".$sTableName." b ON b.?# = a.?# WHERE a.?#=? {$sFilterFields} {$sOrder} {$sLimit}";
    
$aQueryParams=array_merge(array($sql,$aFilter['#join_table'],$sPrimaryKey,$aFilter['#relation_key'],$aFilter['#by_key'],$aFilter['#by_value']),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;
}

Получение сущностей по связанной таблице

GetTableName() method
public static string GetTableName(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} string
Source Code: /engine/classes/MapperORM.class.php#379 (show)
public static function GetTableName($oEntity) {
    
/**
     * Варианты таблиц:
     *     prefix_user -> если модуль совпадает с сущностью
     *     prefix_user_invite -> если модуль не сопадает с сущностью
     */
    
$sClass Engine::getInstance()->Plugin_GetDelegater('entity'is_object($oEntity)?get_class($oEntity):$oEntity);
    
$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(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: /engine/classes/MapperORM.class.php#316 (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: /engine/classes/MapperORM.class.php#326 (show)
public function ShowColumnsFromTable($sTableName) {
    if (
false === ($aItems Engine::getInstance()->Cache_GetLife("columns_table_{$sTableName}"))) {
        
$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_SetLife($aItems"columns_table_{$sTableName}");
    }
    return 
$aItems;
}

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

ShowPrimaryIndexFrom() method
public array ShowPrimaryIndexFrom(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} array
Source Code: /engine/classes/MapperORM.class.php#348 (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: /engine/classes/MapperORM.class.php#358 (show)
public function ShowPrimaryIndexFromTable($sTableName) {
    if (
false === ($aItems Engine::getInstance()->Cache_GetLife("index_table_{$sTableName}"))) {
        
$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_SetLife($aItems"index_table_{$sTableName}");
    }
    return 
$aItems;
}

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

UpdateEntity() method
public int|bool UpdateEntity(EntityORM $oEntity)
$oEntity EntityORM Объект сущности
{return} int|bool Возвращает число измененых записей в БД
Source Code: /engine/classes/MapperORM.class.php#43 (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->_getData());
    } 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(0,count($aOriginalData),$this->oDb)));
        
$sql "UPDATE ".$sTableName." SET ?a WHERE 1=1 AND "$sWhere;
        return 
$this->oDb->query($sql,$oEntity->_getData());
    }
}

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

deleteManyToManySet() method
public bool deleteManyToManySet(string $sDbTableAlias, string $sEntityKey, int $iEntityId)
$sDbTableAlias string Алиас имени таблицы связи
$sEntityKey string Название поля в таблице связи с id сущности, для которой удаляются связи.
$iEntityId int Id сущнсоти, для который удаляются связи
{return} bool
Source Code: /engine/classes/MapperORM.class.php#457 (show)
public function deleteManyToManySet($sDbTableAlias$sEntityKey$iEntityId) {
    if (!
Config::Get($sDbTableAlias)) return false;
    
$sql 'DELETE FROM '.Config::Get($sDbTableAlias).' WHERE ?# = ?d';
    
$this->oDb->query($sql$sEntityKey$iEntityId);
    return 
true;
}

Удаление связей many_to_many для объекта. Используется при удалении сущности, чтобы не удалять большие коллекции связанных объектов через updateManyToManySet(), где используется IN.

getManyToManySet() method
public array getManyToManySet(string $sDbTableAlias, string $sEntityKey, int $iEntityId, string $sRelationKey)
$sDbTableAlias string Алиас имени таблицы связи, например, 'db.table.my_relation'
$sEntityKey string Название поля в таблице связи с id сущности, для которой зегружаются объекты.
$iEntityId int Id сущнсоти, для который загружаются объекты
$sRelationKey string Название поля в таблице связи с id сущности, объекты которой загружаются по связи.
{return} array Список id из столбца $sRelationKey, у которых столбец $sEntityKey = $iEntityId
Source Code: /engine/classes/MapperORM.class.php#411 (show)
public function getManyToManySet($sDbTableAlias$sEntityKey$iEntityId$sRelationKey) {
    if (!
Config::Get($sDbTableAlias)) return array();
    
$sql 'SELECT ?# FROM '.Config::Get($sDbTableAlias).' WHERE ?# = ?d';
    return 
$this->oDb->selectCol($sql$sRelationKey$sEntityKey$iEntityId);
}

Загрузка данных из таблицы связи many_to_many

updateManyToManySet() method
public bool updateManyToManySet(string $sDbTableAlias, string $sEntityKey, int $iEntityId, string $sRelationKey, array $aInsertSet, array $aDeleteSet)
$sDbTableAlias string Алиас имени таблицы связи
$sEntityKey string Название поля в таблице связи с id сущности, для которой обновляются связи.
$iEntityId int Id сущнсоти, для который обновляются связи
$sRelationKey string Название поля в таблице связи с id сущности, с объектами которой назначаются связи.
$aInsertSet array Массив id для $sRelationKey, которые нужно добавить
$aDeleteSet array Массив id для $sRelationKey, которые нужно удалить
{return} bool
Source Code: /engine/classes/MapperORM.class.php#427 (show)
public function updateManyToManySet($sDbTableAlias$sEntityKey$iEntityId$sRelationKey$aInsertSet$aDeleteSet) {
    if (!
Config::Get($sDbTableAlias)) return false;
    if (
count($aDeleteSet)) {
        
$sql 'DELETE FROM '.Config::Get($sDbTableAlias).' WHERE ?# = ?d AND ?# IN (?a)';
        
$this->oDb->query($sql,  $sEntityKey$iEntityId$sRelationKey$aDeleteSet);
    }

    if (
count($aInsertSet)) {
        
$sql 'INSERT INTO '.Config::Get($sDbTableAlias).' (?#,?#) VALUES ';
        
$aParams = array();
        foreach (
$aInsertSet as $iId) {
            
$sql .= '(?d, ?d), ';
            
$aParams[] = $iEntityId;
            
$aParams[] = $iId;
        }
        
$sql substr($sql0, -2); // удаление последних ", "
        
call_user_func_array(array($this->oDb'query'), array_merge(array($sql,$sEntityKey$sRelationKey), $aParams));
    }
    return 
true;
}

Обновление связи many_to_many