MapperORM
Package | engine.orm |
---|---|
Inheritance | class MapperORM » Mapper » LsObject |
Since | 1.0 |
Source Code | /engine/classes/MapperORM.class.php |
Системный класс мапера ORM для работы с БД
Protected Properties
Property | Type | Description | Defined By |
---|---|---|---|
oDb | DbSimple_Generic_Database | Объект подключения к базе данных | Mapper |
Public Methods
Method | Description | Defined 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($sql, 0, -2); // удаление последних ", "
call_user_func_array(array($this->oDb, 'query'), array_merge(array($sql,$sEntityKey, $sRelationKey), $aParams));
}
return true;
}
Обновление связи many_to_many