public function GetItemsByJoinEntity($sEntityJoin, $sKeyJoin, $sRelationKey, $aRelationValues, $aFilter, $sEntityFull = null) { $sEntityFull = $this->_NormalizeEntityRootName($sEntityFull); /** * Кеширование * Если параметр #cache указан и пуст, значит игнорируем кэширование для запроса */ if (array_key_exists('#cache', $aFilter) && !$aFilter['#cache']) { $aEntities = $this->oMapperORM->GetItemsByJoinEntity($sEntityJoin, $sKeyJoin, $sRelationKey, $aRelationValues, $aFilter, $sEntityFull); } else { $sEntityJoin = $this->Plugin_GetRootDelegater('entity', $sEntityJoin); $sCacheKey = 'items_by_join_entity_' . serialize(array($sEntityJoin, $sKeyJoin, $sRelationKey, $aRelationValues, $aFilter, $sEntityFull)); /** * Формируем теги для сброса кеша * Сброс идет по обновлению запрашиваемой сущности * Дополнительно по обновлению таблицы связей */ $aCacheTags = array($sEntityFull . '_save', $sEntityFull . '_delete', $sEntityJoin . '_save', $sEntityJoin . '_delete'); $iCacheTime = 60 * 60 * 24; // todo: скорее лучше хранить в свойстве сущности, для возможности выборочного переопределения /** * Переопределяем из параметров */ if (isset($aFilter['#cache'][0])) { $sCacheKey = $aFilter['#cache'][0]; } if (isset($aFilter['#cache'][1])) { $aCacheTags = $aFilter['#cache'][1]; } if (isset($aFilter['#cache'][2])) { $iCacheTime = $aFilter['#cache'][2]; } /** * Смотрим в кеше */ if (false === ($aEntities = $this->Cache_Get($sCacheKey))) { $aEntities = $this->oMapperORM->GetItemsByJoinEntity($sEntityJoin, $sKeyJoin, $sRelationKey, $aRelationValues, $aFilter, $sEntityFull); $this->Cache_Set($aEntities, $sCacheKey, $aCacheTags, $iCacheTime); } } /** * Если запрашиваем постраничный список, то возвращаем сам список и общее количество записей */ if (isset($aFilter['#page'])) { if (isset($aFilter['#cache'][0])) { /** * Задан собственный ключ для хранения кеша, поэтому нужно его сменить для передачи в GetCount* * Добавляем префикс 'count_' */ $aFilter['#cache'][0] = 'count_' . $aFilter['#cache'][0]; } return array('collection' => $aEntities, 'count' => $this->GetCountItemsByJoinEntity($sEntityJoin, $sKeyJoin, $sRelationKey, $aRelationValues, $aFilter, $sEntityFull = null)); } return $aEntities; }