1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-05 16:04:24 +03:00

update ORM by ajaxy

This commit is contained in:
Mzhelskiy Maxim 2010-08-29 07:03:53 +00:00
parent 3390f0e21d
commit 1054f9c8de
3 changed files with 139 additions and 35 deletions

View file

@ -24,6 +24,7 @@ abstract class EntityORM extends Entity {
const RELATION_TYPE_BELONGS_TO='belongs_to'; const RELATION_TYPE_BELONGS_TO='belongs_to';
const RELATION_TYPE_HAS_MANY='has_many'; const RELATION_TYPE_HAS_MANY='has_many';
const RELATION_TYPE_HAS_ONE='has_one'; const RELATION_TYPE_HAS_ONE='has_one';
const RELATION_TYPE_MANY_TO_MANY='many_to_many';
protected $aRelations=array(); protected $aRelations=array();
protected $aRelationsData=array(); protected $aRelationsData=array();
@ -36,7 +37,16 @@ abstract class EntityORM extends Entity {
parent::__construct($aParam); parent::__construct($aParam);
} }
public function _GetPrimatyKey() { public function _GetPrimaryKey() {
if(!$this->_getDataOne($this->sPrimaryKey)) {
$sModulePrefix=null;
if (preg_match('/Entity([^_]+)/',get_class($this),$sModulePrefix)) {
$sModulePrefix=func_underscore($sModulePrefix[1]).'_';
if($this->_getDataOne($sModulePrefix.$this->sPrimaryKey)) {
$this->sPrimaryKey=$sModulePrefix.$this->sPrimaryKey;
}
}
}
return $this->sPrimaryKey; return $this->sPrimaryKey;
} }
@ -64,6 +74,10 @@ abstract class EntityORM extends Entity {
return $this->_Method(__FUNCTION__); return $this->_Method(__FUNCTION__);
} }
public function Reload() {
return $this->_Method(__FUNCTION__);
}
protected function _Method($sName) { protected function _Method($sName) {
$sModuleName=Engine::GetModuleName($this); $sModuleName=Engine::GetModuleName($this);
$sEntityName=Engine::GetEntityName($this); $sEntityName=Engine::GetEntityName($this);
@ -89,9 +103,9 @@ abstract class EntityORM extends Entity {
} }
public function __call($sName,$aArgs) { public function __call($sName,$aArgs) {
$sType=strtolower(substr($sName,0,3)); $sType=substr($sName,0,strpos(func_underscore($sName),'_'));
if (!strpos($sName,'_') and in_array($sType,array('get','set'))) { if (!strpos($sName,'_') and in_array($sType,array('get','set','reload'))) {
$sKey=func_underscore(substr($sName,3)); $sKey=func_underscore(str_replace($sType,'',$sName));
if ($sType=='get') { if ($sType=='get') {
if (isset($this->_aData[$sKey])) { if (isset($this->_aData[$sKey])) {
return $this->_aData[$sKey]; return $this->_aData[$sKey];
@ -110,6 +124,10 @@ abstract class EntityORM extends Entity {
$sEntityRel=$this->aRelations[$sKey][1]; $sEntityRel=$this->aRelations[$sKey][1];
$sRelationType=$this->aRelations[$sKey][0]; $sRelationType=$this->aRelations[$sKey][0];
$sRelationKey=$this->aRelations[$sKey][2]; $sRelationKey=$this->aRelations[$sKey][2];
$sRelationJoinTable=null;
if($sRelationType == self::RELATION_TYPE_MANY_TO_MANY && array_key_exists(3, $this->aRelations[$sKey])) {
$sRelationJoinTable=$this->aRelations[$sKey][3];
}
/** /**
* Если связь уже загруженна, то возвращаем сразу результат * Если связь уже загруженна, то возвращаем сразу результат
@ -118,23 +136,42 @@ abstract class EntityORM extends Entity {
return $this->aRelationsData[$sKey]; return $this->aRelationsData[$sKey];
} }
$sModuleName=Engine::GetModuleName($sEntityRel);
$sEntityName=Engine::GetEntityName($sEntityRel);
$sPluginPrefix=Engine::GetPluginPrefix($sEntityRel);
$iPrimaryKeyValue=$this->_getDataOne($this->_GetPrimatyKey()); $sRelModuleName=Engine::GetModuleName($sEntityRel);
$sRelEntityName=Engine::GetEntityName($sEntityRel);
$sRelPluginPrefix=Engine::GetPluginPrefix($sEntityRel);
$sRelPrimaryKey='id';
if($oRelEntity=Engine::GetEntity($sEntityRel)) {
$sRelPrimaryKey=$oRelEntity->_GetPrimaryKey();
}
$iPrimaryKeyValue=$this->_getDataOne($this->_GetPrimaryKey());
$sCmd=''; $sCmd='';
$aCmdArgs=array(); $aCmdArgs=array();
switch ($sRelationType) { switch ($sRelationType) {
case self::RELATION_TYPE_HAS_MANY : case self::RELATION_TYPE_BELONGS_TO :
$sCmd="{$sPluginPrefix}{$sModuleName}_get{$sEntityName}ItemsBy".func_camelize($sRelationKey); $sCmd="{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}By".func_camelize($sRelPrimaryKey);
$aCmdArgs[0]=$this->_getDataOne($sRelationKey);
break;
case self::RELATION_TYPE_HAS_ONE :
$sCmd="{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}By".func_camelize($sRelationKey);
$aCmdArgs[0]=$iPrimaryKeyValue; $aCmdArgs[0]=$iPrimaryKeyValue;
break; break;
case self::RELATION_TYPE_BELONGS_TO : case self::RELATION_TYPE_HAS_MANY :
$sCmd="{$sPluginPrefix}{$sModuleName}_get{$sEntityName}By".func_camelize($this->_GetPrimatyKey()); $sCmd="{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsBy".func_camelize($sRelationKey);
$aCmdArgs[0]=$this->_getDataOne($sRelationKey); $aCmdArgs[0]=$iPrimaryKeyValue;
case self::RELATION_TYPE_HAS_ONE : break;
case self::RELATION_TYPE_MANY_TO_MANY :
$sCmd="{$sRelPluginPrefix}Module{$sRelModuleName}_get{$sRelEntityName}ItemsByJoinTable";
$sByKey = strpos($this->_GetPrimaryKey(), $sModulePrefix) === 0 ? $this->_GetPrimaryKey() : $sModulePrefix.$this->_GetPrimaryKey();
$aCmdArgs[0] = array(
'join_table' => $sRelationJoinTable,
'relation_key' => $sRelationKey,
'by_key' => $sByKey,
'by_value' => $iPrimaryKeyValue,
);
break;
default: default:
break; break;
} }
@ -151,6 +188,11 @@ abstract class EntityORM extends Entity {
} else { } else {
$this->_aData[$sKey]=$aArgs[0]; $this->_aData[$sKey]=$aArgs[0];
} }
} elseif ($sType=='reload') {
if (array_key_exists($sKey,$this->aRelationsData)) {
unset($this->aRelationsData[$sKey]);
return $this->__call('get'.func_camelize($sKey),$aArgs);
}
} }
} else { } else {
return Engine::getInstance()->_CallModule($sName,$aArgs); return Engine::getInstance()->_CallModule($sName,$aArgs);

View file

@ -30,18 +30,18 @@ class MapperORM extends Mapper {
public function UpdateEntity($oEntity) { public function UpdateEntity($oEntity) {
$sTableName = self::GetTableName($oEntity); $sTableName = self::GetTableName($oEntity);
$iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimatyKey()); $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimaryKey());
$sql = "UPDATE ".$sTableName." SET ?a WHERE ".$oEntity->_GetPrimatyKey()." = ? "; $sql = "UPDATE ".$sTableName." SET ?a WHERE ".$oEntity->_GetPrimaryKey()." = ? ";
return $this->oDb->query($sql,$oEntity->_getData(),$iPrimaryKeyValue); return $this->oDb->query($sql,$oEntity->_getData(),$iPrimaryKeyValue);
} }
public function DeleteEntity($oEntity) { public function DeleteEntity($oEntity) {
$sTableName = self::GetTableName($oEntity); $sTableName = self::GetTableName($oEntity);
$iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimatyKey()); $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimaryKey());
$sql = "DELETE FROM ".$sTableName." WHERE ".$oEntity->_GetPrimatyKey()." = ? "; $sql = "DELETE FROM ".$sTableName." WHERE ".$oEntity->_GetPrimaryKey()." = ? ";
return $this->oDb->query($sql,$iPrimaryKeyValue); return $this->oDb->query($sql,$iPrimaryKeyValue);
} }
@ -129,18 +129,35 @@ class MapperORM extends Mapper {
return $aItems; return $aItems;
} }
public function GetItemsByJoinTable($aData,$sEntityFull) {
if(empty($aData)) {
return null;
}
$sTableName = self::GetTableName($sEntityFull);
$sql = "SELECT a.*, b.* FROM ?# a LEFT JOIN ".$sTableName." b USING(?#) WHERE a.?#=?";
$aItems = array();
if($aRows=$this->oDb->select($sql, $aData['join_table'], $aData['relation_key'], $aData['by_key'], $aData['by_value'])) {
foreach($aRows as $aRow) {
$oEntity=Engine::GetEntity($sEntityFull,$aRow);
$oEntity->_SetIsNew(false);
$aItems[] = $oEntity;
}
}
return $aItems;
}
public static function GetTableName($oEntity) { public static function GetTableName($oEntity) {
/** /**
* Варианты таблиц: * Варианты таблиц:
* prefix_user -> если модуль совпадает с сущностью * prefix_user -> если модуль совпадает с сущностью
* prefix_user_invite -> если модуль не сопадает с сущностью * prefix_user_invite -> если модуль не сопадает с сущностью
*/ */
$sModuleName = strtolower(Engine::GetModuleName($oEntity)); $sModuleName = func_underscore(Engine::GetModuleName($oEntity));
$sEntityName = strtolower(Engine::GetEntityName($oEntity)); $sEntityName = func_underscore(Engine::GetEntityName($oEntity));
if ($sModuleName==$sEntityName) { if (strpos($sEntityName,$sModuleName)===0) {
$sTable=$sModuleName; $sTable=func_underscore($sEntityName);
} else { } else {
$sTable=$sModuleName.'_'.$sEntityName; $sTable=func_underscore($sModuleName).'_'.func_underscore($sEntityName);
} }
if(Config::Get('db.table.'.$sTable)) { if(Config::Get('db.table.'.$sTable)) {
return Config::Get('db.table.'.$sTable); return Config::Get('db.table.'.$sTable);

View file

@ -40,7 +40,7 @@ abstract class ModuleORM extends Module {
return $oEntity; return $oEntity;
} elseif ($res) { } elseif ($res) {
// есть автоинкремент, устанавливаем его // есть автоинкремент, устанавливаем его
$oEntity->_setData(array($oEntity->_GetPrimatyKey() => $res)); $oEntity->_setData(array($oEntity->_GetPrimaryKey() => $res));
return $oEntity; return $oEntity;
} }
return false; return false;
@ -76,6 +76,19 @@ abstract class ModuleORM extends Module {
} }
protected function _ReloadEntity($oEntity) {
if($sPrimaryKey=$oEntity->_getPrimaryKey()) {
if($sPrimaryKeyValue=$oEntity->_getDataOne($sPrimaryKey)) {
if($oEntityNew=$this->GetByFilter(array($sPrimaryKey=>$sPrimaryKeyValue),Engine::GetEntityName($oEntity))) {
$oEntity->_setData($oEntityNew->_getData());
return $oEntity;
}
}
}
return false;
}
public function GetByFilter($aFilter=array(),$sEntityFull=null) { public function GetByFilter($aFilter=array(),$sEntityFull=null) {
if (is_null($sEntityFull)) { if (is_null($sEntityFull)) {
$sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.Engine::GetModuleName(get_class($this)); $sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.Engine::GetModuleName(get_class($this));
@ -129,7 +142,7 @@ abstract class ModuleORM extends Module {
$sRelModuleName=Engine::GetModuleName($oRelEntityEmpty); $sRelModuleName=Engine::GetModuleName($oRelEntityEmpty);
$sRelEntityName=Engine::GetEntityName($oRelEntityEmpty); $sRelEntityName=Engine::GetEntityName($oRelEntityEmpty);
$sRelPluginPrefix=Engine::GetPluginPrefix($oRelEntityEmpty); $sRelPluginPrefix=Engine::GetPluginPrefix($oRelEntityEmpty);
// ItemsByArrayId - id пока идет костылем, т.к. у стандартных сущностей нет метода _GetPrimatyKey() // ItemsByArrayId - id пока идет костылем, т.к. у стандартных сущностей нет метода _GetPrimaryKey()
$aRelData=Engine::GetInstance()->_CallModule("{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsByArrayId",array($aEntityKeys[$sRelKey])); $aRelData=Engine::GetInstance()->_CallModule("{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsByArrayId",array($aEntityKeys[$sRelKey]));
/** /**
* Собираем набор * Собираем набор
@ -157,11 +170,20 @@ abstract class ModuleORM extends Module {
$aData=$this->oMapperORM->GetItemsByArray($aFilter,$sEntityFull); $aData=$this->oMapperORM->GetItemsByArray($aFilter,$sEntityFull);
foreach ($aData as $oEntity) { foreach ($aData as $oEntity) {
// здесь под вопросом какое поле использовать в качестве ключа, всегда примари или тот, который передан? // здесь под вопросом какое поле использовать в качестве ключа, всегда примари или тот, который передан?
$aEntities[$oEntity->_getDataOne($oEntity->_GetPrimatyKey())]=$oEntity; $aEntities[$oEntity->_getDataOne($oEntity->_GetPrimaryKey())]=$oEntity;
} }
return $aEntities; return $aEntities;
} }
public function GetItemsByJoinTable($aJoinData=array(),$sEntityFull=null) {
if (is_null($sEntityFull)) {
$sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.Engine::GetModuleName(get_class($this));
} elseif (!substr_count($sEntityFull,'_')) {
$sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.$sEntityFull;
}
return $this->oMapperORM->GetItemsByJoinTable($aJoinData,$sEntityFull);
}
public function __call($sName,$aArgs) { public function __call($sName,$aArgs) {
if (preg_match("@^add([\w]+)$@i",$sName,$aMatch)) { if (preg_match("@^add([\w]+)$@i",$sName,$aMatch)) {
return $this->_AddEntity($aArgs[0]); return $this->_AddEntity($aArgs[0]);
@ -179,13 +201,36 @@ abstract class ModuleORM extends Module {
return $this->_DeleteEntity($aArgs[0]); return $this->_DeleteEntity($aArgs[0]);
} }
$sNameUnderscore=func_underscore($sName); if (preg_match("@^reload([\w]+)$@i",$sName,$aMatch)) {
return $this->_ReloadEntity($aArgs[0]);
}
$sNameUnderscore=func_underscore($sName);
$iEntityPosEnd=strlen($sNameUnderscore)-1;
if(substr_count($sNameUnderscore,'_items')) {
$iEntityPosEnd=strpos($sNameUnderscore,'_items');
} else if(substr_count($sNameUnderscore,'_by')) {
$iEntityPosEnd=strpos($sNameUnderscore,'_by');
} else if(substr_count($sNameUnderscore,'_all')) {
$iEntityPosEnd=strpos($sNameUnderscore,'_all');
}
$sEntityName=substr($sNameUnderscore,4,$iEntityPosEnd-4);
/**
* getUserRoleJoinByUserIdAndRoleId() get_user-role-join_by_user_id_and_role_id
*/
$sNameUnderscore=substr_replace($sNameUnderscore,str_replace('_','',$sEntityName),4,$iEntityPosEnd-4);
$sEntityName=func_camelize($sEntityName);
/** /**
* getUserItemsByArrayId() get_user_items_by_array_id * getUserItemsByArrayId() get_user_items_by_array_id
*/ */
if (preg_match("@^get_([a-z]+)_items_by_array_([_a-z]+)$@i",$sNameUnderscore,$aMatch)) { if (preg_match("@^get_([a-z]+)_items_by_array_([_a-z]+)$@i",$sNameUnderscore,$aMatch)) {
return $this->GetItemsByArray(array($aMatch[2]=>$aArgs[0]),$aMatch[1]); return $this->GetItemsByArray(array($aMatch[2]=>$aArgs[0]),$sEntityName);
}
/**
* getUserItemsByJoinTable() get_user_items_by_join_table
*/
if (preg_match("@^get_([a-z]+)_items_by_join_table$@i",$sNameUnderscore,$aMatch)) {
return $this->GetItemsByJoinTable($aArgs[0],func_camelize($sEntityName));
} }
/** /**
* getUserByLogin() get_user_by_login * getUserByLogin() get_user_by_login
@ -197,9 +242,9 @@ abstract class ModuleORM extends Module {
if (preg_match("@^get_([a-z]+)((_items)|())_by_([_a-z]+)$@i",$sNameUnderscore,$aMatch)) { if (preg_match("@^get_([a-z]+)((_items)|())_by_([_a-z]+)$@i",$sNameUnderscore,$aMatch)) {
$aFilter=array_combine(explode('_and_',$aMatch[5]),$aArgs); $aFilter=array_combine(explode('_and_',$aMatch[5]),$aArgs);
if ($aMatch[2]=='_items') { if ($aMatch[2]=='_items') {
return $this->GetItemsByFilter($aFilter,$aMatch[1]); return $this->GetItemsByFilter($aFilter,$sEntityName);
} else { } else {
return $this->GetByFilter($aFilter,$aMatch[1]); return $this->GetByFilter($aFilter,$sEntityName);
} }
} }
/** /**
@ -210,7 +255,7 @@ abstract class ModuleORM extends Module {
if (isset($aArgs[0]) and is_array($aArgs[0])) { if (isset($aArgs[0]) and is_array($aArgs[0])) {
$aFilter=$aArgs[0]; $aFilter=$aArgs[0];
} }
return $this->GetItemsByFilter($aFilter,$aMatch[1]); return $this->GetItemsByFilter($aFilter,$sEntityName);
} }
return $this->oEngine->_CallModule($sName,$aArgs); return $this->oEngine->_CallModule($sName,$aArgs);