Skip to content

Commit

Permalink
ORM: поддержка опций '#value-set' и '#value-default' для запросов с '…
Browse files Browse the repository at this point in the history
…#with'

Возможность в '#with' указывать расширенный фильтр запросов, например, '#with'=>array('topic'=>array('blog_id'=>123))
  • Loading branch information
mzhelskiy committed Feb 5, 2014
1 parent 66177b0 commit 32fbce1
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion classes/engine/ModuleORM.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,10 @@ public function GetItemsByFilter($aFilter=array(),$sEntityFull=null) {
if (!is_array($aFilter['#with'])) {
$aFilter['#with']=array($aFilter['#with']);
}
/**
* Приводим значение к единой форме ассоциативного массива: array('user'=>array(), 'topic'=>array('blog_id'=>123) )
*/
func_array_simpleflip($aFilter['#with'],array());
/**
* Формируем список примари ключей
*/
Expand All @@ -412,7 +416,20 @@ public function GetItemsByFilter($aFilter=array(),$sEntityFull=null) {
$oEntityEmpty=Engine::GetEntity($sEntityFull);
$aRelations=$oEntityEmpty->_getRelations();
$aEntityKeys=array();
foreach ($aFilter['#with'] as $sRelationName) {
foreach ($aFilter['#with'] as $sRelationName => $aRelationFilter) {
if (!isset($aRelations[$sRelationName])) {
continue;
}
/**
* Если необходимо, то выставляем сразу нужное значение и не делаем никаких запросов
*/
if (isset($aRelationFilter['#value-set'])) {
foreach ($aEntities as $oEntity) {
$oEntity->_setData(array($sRelationName => $aRelationFilter['#value-set']));
}
continue;
}

$sRelType=$aRelations[$sRelationName][0];
$sRelEntity=$this->Plugin_GetRootDelegater('entity',$aRelations[$sRelationName][1]); // получаем корневую сущность, без учета наследников
$sRelKey=$aRelations[$sRelationName][2];
Expand Down Expand Up @@ -441,9 +458,11 @@ public function GetItemsByFilter($aFilter=array(),$sEntityFull=null) {
$aRelData=Engine::GetInstance()->_CallModule("{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsByArray{$sRelPrimaryKey}", array($aEntityKeys[$sRelKey]));
} elseif ($sRelType==EntityORM::RELATION_TYPE_HAS_ONE) {
$aFilterRel=array($sRelKey.' in'=>$aEntityPrimaryKeys,'#index-from'=>$sRelKey);
$aFilterRel=array_merge($aFilterRel,$aRelationFilter);
$aRelData=Engine::GetInstance()->_CallModule("{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsByFilter", array($aFilterRel));
} elseif ($sRelType==EntityORM::RELATION_TYPE_HAS_MANY) {
$aFilterRel=array($sRelKey.' in'=>$aEntityPrimaryKeys,'#index-group'=>$sRelKey);
$aFilterRel=array_merge($aFilterRel,$aRelationFilter);
$aRelData=Engine::GetInstance()->_CallModule("{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsByFilter", array($aFilterRel));
}
/**
Expand All @@ -459,6 +478,8 @@ public function GetItemsByFilter($aFilter=array(),$sEntityFull=null) {
}
if (isset($aRelData[$sKeyData])) {
$oEntity->_setData(array($sRelationName => $aRelData[$sKeyData]));
} elseif (isset($aRelationFilter['#value-default'])) {
$oEntity->_setData(array($sRelationName => $aRelationFilter['#value-default']));
}
}
}
Expand Down

0 comments on commit 32fbce1

Please sign in to comment.