Changeset 998
- Timestamp:
- 08/29/10 11:03:53 (18 months ago)
- Location:
- trunk/engine/classes
- Files:
-
- 3 modified
-
EntityORM.class.php (modified) (7 diffs)
-
MapperORM.class.php (modified) (4 diffs)
-
ModuleORM.class.php (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/engine/classes/EntityORM.class.php
r983 r998 25 25 const RELATION_TYPE_HAS_MANY='has_many'; 26 26 const RELATION_TYPE_HAS_ONE='has_one'; 27 const RELATION_TYPE_MANY_TO_MANY='many_to_many'; 27 28 28 29 protected $aRelations=array(); … … 37 38 } 38 39 39 public function _GetPrimatyKey() { 40 public function _GetPrimaryKey() { 41 if(!$this->_getDataOne($this->sPrimaryKey)) { 42 $sModulePrefix=null; 43 if (preg_match('/Entity([^_]+)/',get_class($this),$sModulePrefix)) { 44 $sModulePrefix=func_underscore($sModulePrefix[1]).'_'; 45 if($this->_getDataOne($sModulePrefix.$this->sPrimaryKey)) { 46 $this->sPrimaryKey=$sModulePrefix.$this->sPrimaryKey; 47 } 48 } 49 } 40 50 return $this->sPrimaryKey; 41 51 } … … 62 72 63 73 public function Delete() { 74 return $this->_Method(__FUNCTION__); 75 } 76 77 public function Reload() { 64 78 return $this->_Method(__FUNCTION__); 65 79 } … … 90 104 91 105 public function __call($sName,$aArgs) { 92 $sType=s trtolower(substr($sName,0,3));93 if (!strpos($sName,'_') and in_array($sType,array('get','set' ))) {94 $sKey=func_underscore(s ubstr($sName,3));106 $sType=substr($sName,0,strpos(func_underscore($sName),'_')); 107 if (!strpos($sName,'_') and in_array($sType,array('get','set','reload'))) { 108 $sKey=func_underscore(str_replace($sType,'',$sName)); 95 109 if ($sType=='get') { 96 110 if (isset($this->_aData[$sKey])) { … … 111 125 $sRelationType=$this->aRelations[$sKey][0]; 112 126 $sRelationKey=$this->aRelations[$sKey][2]; 127 $sRelationJoinTable=null; 128 if($sRelationType == self::RELATION_TYPE_MANY_TO_MANY && array_key_exists(3, $this->aRelations[$sKey])) { 129 $sRelationJoinTable=$this->aRelations[$sKey][3]; 130 } 113 131 114 132 /** … … 119 137 } 120 138 121 $sModuleName=Engine::GetModuleName($sEntityRel); 122 $sEntityName=Engine::GetEntityName($sEntityRel); 123 $sPluginPrefix=Engine::GetPluginPrefix($sEntityRel); 124 125 $iPrimaryKeyValue=$this->_getDataOne($this->_GetPrimatyKey()); 139 140 $sRelModuleName=Engine::GetModuleName($sEntityRel); 141 $sRelEntityName=Engine::GetEntityName($sEntityRel); 142 $sRelPluginPrefix=Engine::GetPluginPrefix($sEntityRel); 143 $sRelPrimaryKey='id'; 144 if($oRelEntity=Engine::GetEntity($sEntityRel)) { 145 $sRelPrimaryKey=$oRelEntity->_GetPrimaryKey(); 146 } 147 148 $iPrimaryKeyValue=$this->_getDataOne($this->_GetPrimaryKey()); 126 149 127 150 $sCmd=''; 128 151 $aCmdArgs=array(); 129 152 switch ($sRelationType) { 153 case self::RELATION_TYPE_BELONGS_TO : 154 $sCmd="{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}By".func_camelize($sRelPrimaryKey); 155 $aCmdArgs[0]=$this->_getDataOne($sRelationKey); 156 break; 157 case self::RELATION_TYPE_HAS_ONE : 158 $sCmd="{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}By".func_camelize($sRelationKey); 159 $aCmdArgs[0]=$iPrimaryKeyValue; 160 break; 130 161 case self::RELATION_TYPE_HAS_MANY : 131 $sCmd="{$s PluginPrefix}{$sModuleName}_get{$sEntityName}ItemsBy".func_camelize($sRelationKey);162 $sCmd="{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsBy".func_camelize($sRelationKey); 132 163 $aCmdArgs[0]=$iPrimaryKeyValue; 133 164 break; 134 case self::RELATION_TYPE_BELONGS_TO : 135 $sCmd="{$sPluginPrefix}{$sModuleName}_get{$sEntityName}By".func_camelize($this->_GetPrimatyKey()); 136 $aCmdArgs[0]=$this->_getDataOne($sRelationKey); 137 case self::RELATION_TYPE_HAS_ONE : 165 case self::RELATION_TYPE_MANY_TO_MANY : 166 $sCmd="{$sRelPluginPrefix}Module{$sRelModuleName}_get{$sRelEntityName}ItemsByJoinTable"; 167 $sByKey = strpos($this->_GetPrimaryKey(), $sModulePrefix) === 0 ? $this->_GetPrimaryKey() : $sModulePrefix.$this->_GetPrimaryKey(); 168 $aCmdArgs[0] = array( 169 'join_table' => $sRelationJoinTable, 170 'relation_key' => $sRelationKey, 171 'by_key' => $sByKey, 172 'by_value' => $iPrimaryKeyValue, 173 ); 174 break; 138 175 default: 139 176 break; 140 } 177 } 141 178 $res=Engine::GetInstance()->_CallModule($sCmd,$aCmdArgs); 142 179 143 180 $this->aRelationsData[$sKey]=$res; 144 181 return $res; … … 152 189 $this->_aData[$sKey]=$aArgs[0]; 153 190 } 191 } elseif ($sType=='reload') { 192 if (array_key_exists($sKey,$this->aRelationsData)) { 193 unset($this->aRelationsData[$sKey]); 194 return $this->__call('get'.func_camelize($sKey),$aArgs); 195 } 154 196 } 155 197 } else { -
trunk/engine/classes/MapperORM.class.php
r983 r998 29 29 } 30 30 31 public function UpdateEntity($oEntity) { 31 public function UpdateEntity($oEntity) { 32 32 $sTableName = self::GetTableName($oEntity); 33 $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrima tyKey());33 $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimaryKey()); 34 34 35 $sql = "UPDATE ".$sTableName." SET ?a WHERE ".$oEntity->_GetPrima tyKey()." = ? ";35 $sql = "UPDATE ".$sTableName." SET ?a WHERE ".$oEntity->_GetPrimaryKey()." = ? "; 36 36 37 37 return $this->oDb->query($sql,$oEntity->_getData(),$iPrimaryKeyValue); … … 40 40 public function DeleteEntity($oEntity) { 41 41 $sTableName = self::GetTableName($oEntity); 42 $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrima tyKey());42 $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimaryKey()); 43 43 44 $sql = "DELETE FROM ".$sTableName." WHERE ".$oEntity->_GetPrima tyKey()." = ? ";44 $sql = "DELETE FROM ".$sTableName." WHERE ".$oEntity->_GetPrimaryKey()." = ? "; 45 45 return $this->oDb->query($sql,$iPrimaryKeyValue); 46 46 } … … 130 130 } 131 131 132 public function GetItemsByJoinTable($aData,$sEntityFull) { 133 if(empty($aData)) { 134 return null; 135 } 136 $sTableName = self::GetTableName($sEntityFull); 137 $sql = "SELECT a.*, b.* FROM ?# a LEFT JOIN ".$sTableName." b USING(?#) WHERE a.?#=?"; 138 $aItems = array(); 139 if($aRows=$this->oDb->select($sql, $aData['join_table'], $aData['relation_key'], $aData['by_key'], $aData['by_value'])) { 140 foreach($aRows as $aRow) { 141 $oEntity=Engine::GetEntity($sEntityFull,$aRow); 142 $oEntity->_SetIsNew(false); 143 $aItems[] = $oEntity; 144 } 145 } 146 return $aItems; 147 } 148 132 149 public static function GetTableName($oEntity) { 133 150 /** … … 136 153 * prefix_user_invite -> если модуль не сопадает с сущностью 137 154 */ 138 $sModuleName = strtolower(Engine::GetModuleName($oEntity));139 $sEntityName = strtolower(Engine::GetEntityName($oEntity));140 if ( $sModuleName==$sEntityName) {141 $sTable= $sModuleName;155 $sModuleName = func_underscore(Engine::GetModuleName($oEntity)); 156 $sEntityName = func_underscore(Engine::GetEntityName($oEntity)); 157 if (strpos($sEntityName,$sModuleName)===0) { 158 $sTable=func_underscore($sEntityName); 142 159 } else { 143 $sTable= $sModuleName.'_'.$sEntityName;160 $sTable=func_underscore($sModuleName).'_'.func_underscore($sEntityName); 144 161 } 145 162 if(Config::Get('db.table.'.$sTable)) { -
trunk/engine/classes/ModuleORM.class.php
r983 r998 41 41 } elseif ($res) { 42 42 // есть автоинкремент, устанавливаем его 43 $oEntity->_setData(array($oEntity->_GetPrima tyKey() => $res));43 $oEntity->_setData(array($oEntity->_GetPrimaryKey() => $res)); 44 44 return $oEntity; 45 45 } … … 74 74 return $this->_UpdateEntity($oEntity); 75 75 } 76 } 77 78 79 protected function _ReloadEntity($oEntity) { 80 if($sPrimaryKey=$oEntity->_getPrimaryKey()) { 81 if($sPrimaryKeyValue=$oEntity->_getDataOne($sPrimaryKey)) { 82 if($oEntityNew=$this->GetByFilter(array($sPrimaryKey=>$sPrimaryKeyValue),Engine::GetEntityName($oEntity))) { 83 $oEntity->_setData($oEntityNew->_getData()); 84 return $oEntity; 85 } 86 } 87 } 88 return false; 76 89 } 77 90 … … 130 143 $sRelEntityName=Engine::GetEntityName($oRelEntityEmpty); 131 144 $sRelPluginPrefix=Engine::GetPluginPrefix($oRelEntityEmpty); 132 // ItemsByArrayId - id пока идет костылем, т.к. у стандартных сущностей нет метода _GetPrima tyKey()145 // ItemsByArrayId - id пока идет костылем, т.к. у стандартных сущностей нет метода _GetPrimaryKey() 133 146 $aRelData=Engine::GetInstance()->_CallModule("{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsByArrayId",array($aEntityKeys[$sRelKey])); 134 147 /** … … 158 171 foreach ($aData as $oEntity) { 159 172 // здесь под вопросом какое поле использовать в качестве ключа, всегда примари или тот, который передан? 160 $aEntities[$oEntity->_getDataOne($oEntity->_GetPrima tyKey())]=$oEntity;173 $aEntities[$oEntity->_getDataOne($oEntity->_GetPrimaryKey())]=$oEntity; 161 174 } 162 175 return $aEntities; 163 176 } 164 177 165 public function __call($sName,$aArgs) { 178 public function GetItemsByJoinTable($aJoinData=array(),$sEntityFull=null) { 179 if (is_null($sEntityFull)) { 180 $sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.Engine::GetModuleName(get_class($this)); 181 } elseif (!substr_count($sEntityFull,'_')) { 182 $sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.$sEntityFull; 183 } 184 return $this->oMapperORM->GetItemsByJoinTable($aJoinData,$sEntityFull); 185 } 186 187 public function __call($sName,$aArgs) { 166 188 if (preg_match("@^add([\w]+)$@i",$sName,$aMatch)) { 167 189 return $this->_AddEntity($aArgs[0]); … … 178 200 if (preg_match("@^delete([\w]+)$@i",$sName,$aMatch)) { 179 201 return $this->_DeleteEntity($aArgs[0]); 202 } 203 204 if (preg_match("@^reload([\w]+)$@i",$sName,$aMatch)) { 205 return $this->_ReloadEntity($aArgs[0]); 180 206 } 181 207 182 208 $sNameUnderscore=func_underscore($sName); 183 209 $iEntityPosEnd=strlen($sNameUnderscore)-1; 210 if(substr_count($sNameUnderscore,'_items')) { 211 $iEntityPosEnd=strpos($sNameUnderscore,'_items'); 212 } else if(substr_count($sNameUnderscore,'_by')) { 213 $iEntityPosEnd=strpos($sNameUnderscore,'_by'); 214 } else if(substr_count($sNameUnderscore,'_all')) { 215 $iEntityPosEnd=strpos($sNameUnderscore,'_all'); 216 } 217 $sEntityName=substr($sNameUnderscore,4,$iEntityPosEnd-4); 218 /** 219 * getUserRoleJoinByUserIdAndRoleId() get_user-role-join_by_user_id_and_role_id 220 */ 221 $sNameUnderscore=substr_replace($sNameUnderscore,str_replace('_','',$sEntityName),4,$iEntityPosEnd-4); 222 $sEntityName=func_camelize($sEntityName); 184 223 /** 185 224 * getUserItemsByArrayId() get_user_items_by_array_id 186 225 */ 187 226 if (preg_match("@^get_([a-z]+)_items_by_array_([_a-z]+)$@i",$sNameUnderscore,$aMatch)) { 188 return $this->GetItemsByArray(array($aMatch[2]=>$aArgs[0]),$aMatch[1]); 227 return $this->GetItemsByArray(array($aMatch[2]=>$aArgs[0]),$sEntityName); 228 } 229 /** 230 * getUserItemsByJoinTable() get_user_items_by_join_table 231 */ 232 if (preg_match("@^get_([a-z]+)_items_by_join_table$@i",$sNameUnderscore,$aMatch)) { 233 return $this->GetItemsByJoinTable($aArgs[0],func_camelize($sEntityName)); 189 234 } 190 235 /** … … 198 243 $aFilter=array_combine(explode('_and_',$aMatch[5]),$aArgs); 199 244 if ($aMatch[2]=='_items') { 200 return $this->GetItemsByFilter($aFilter,$ aMatch[1]);245 return $this->GetItemsByFilter($aFilter,$sEntityName); 201 246 } else { 202 return $this->GetByFilter($aFilter,$ aMatch[1]);247 return $this->GetByFilter($aFilter,$sEntityName); 203 248 } 204 249 } … … 211 256 $aFilter=$aArgs[0]; 212 257 } 213 return $this->GetItemsByFilter($aFilter,$ aMatch[1]);258 return $this->GetItemsByFilter($aFilter,$sEntityName); 214 259 } 215 260
