/** * Получить список отношений разговор-юзер по списку айдишников * * @param array $aTalkId Список ID сообщений * @param int $sUserId ID пользователя * @return array */ public function GetTalkUsersByArray($aTalkId, $sUserId) { if (!is_array($aTalkId)) { $aTalkId = array($aTalkId); } $aTalkId = array_unique($aTalkId); $aTalkUsers = array(); $aTalkIdNotNeedQuery = array(); /** * Делаем мульти-запрос к кешу */ $aCacheKeys = func_build_cache_keys($aTalkId, 'talk_user_', '_' . $sUserId); if (false !== ($data = $this->Cache_Get($aCacheKeys))) { /** * проверяем что досталось из кеша */ foreach ($aCacheKeys as $sValue => $sKey) { if (array_key_exists($sKey, $data)) { if ($data[$sKey]) { $aTalkUsers[$data[$sKey]->getTalkId()] = $data[$sKey]; } else { $aTalkIdNotNeedQuery[] = $sValue; } } } } /** * Смотрим чего не было в кеше и делаем запрос в БД */ $aTalkIdNeedQuery = array_diff($aTalkId, array_keys($aTalkUsers)); $aTalkIdNeedQuery = array_diff($aTalkIdNeedQuery, $aTalkIdNotNeedQuery); $aTalkIdNeedStore = $aTalkIdNeedQuery; if ($data = $this->oMapper->GetTalkUserByArray($aTalkIdNeedQuery, $sUserId)) { foreach ($data as $oTalkUser) { /** * Добавляем к результату и сохраняем в кеш */ $aTalkUsers[$oTalkUser->getTalkId()] = $oTalkUser; $this->Cache_Set($oTalkUser, "talk_user_{$oTalkUser->getTalkId()}_{$oTalkUser->getUserId()}", array("update_talk_user_{$oTalkUser->getTalkId()}"), 60 * 60 * 24 * 4); $aTalkIdNeedStore = array_diff($aTalkIdNeedStore, array($oTalkUser->getTalkId())); } } /** * Сохраняем в кеш запросы не вернувшие результата */ foreach ($aTalkIdNeedStore as $sId) { $this->Cache_Set(null, "talk_user_{$sId}_{$sUserId}", array("update_talk_user_{$sId}"), 60 * 60 * 24 * 4); } /** * Сортируем результат согласно входящему массиву */ $aTalkUsers = func_array_sort_by_keys($aTalkUsers, $aTalkId); return $aTalkUsers; }
/** * Получить список отношений разговор-юзер по списку айдишников * * @param array $aTalksId Список ID сообщений * @param int $iUserId ID пользователя * * @return array */ public function GetTalkUsersByArray($aTalksId, $iUserId) { if (!is_array($aTalksId)) { $aTalksId = array($aTalksId); } $aTalksId = array_unique($aTalksId); $aTalkUsers = array(); $aTalkIdNotNeedQuery = array(); // Делаем мульти-запрос к кешу $aCacheKeys = F::Array_ChangeValues($aTalksId, 'talk_user_', '_' . $iUserId); if (false !== ($data = E::ModuleCache()->Get($aCacheKeys))) { // проверяем что досталось из кеша foreach ($aCacheKeys as $iIndex => $sKey) { if (array_key_exists($sKey, $data)) { if ($data[$sKey]) { $aTalkUsers[$data[$sKey]->getTalkId()] = $data[$sKey]; } else { $aTalkIdNotNeedQuery[] = $aTalksId[$iIndex]; } } } } // Смотрим чего не было в кеше и делаем запрос в БД $aTalkIdNeedQuery = array_diff($aTalksId, array_keys($aTalkUsers)); $aTalkIdNeedQuery = array_diff($aTalkIdNeedQuery, $aTalkIdNotNeedQuery); $aTalkIdNeedStore = $aTalkIdNeedQuery; if ($aTalkIdNeedQuery) { if ($data = $this->oMapper->GetTalkUserByArray($aTalkIdNeedQuery, $iUserId)) { foreach ($data as $oTalkUser) { // Добавляем к результату и сохраняем в кеш $aTalkUsers[$oTalkUser->getTalkId()] = $oTalkUser; E::ModuleCache()->Set($oTalkUser, "talk_user_{$oTalkUser->getTalkId()}_{$oTalkUser->getUserId()}", array("update_talk_user_{$oTalkUser->getTalkId()}"), 60 * 60 * 24 * 4); $aTalkIdNeedStore = array_diff($aTalkIdNeedStore, array($oTalkUser->getTalkId())); } } } // Сохраняем в кеш запросы не вернувшие результата foreach ($aTalkIdNeedStore as $sId) { E::ModuleCache()->Set(null, "talk_user_{$sId}_{$iUserId}", array("update_talk_user_{$sId}"), 60 * 60 * 24 * 4); } // Сортируем результат согласно входящему массиву $aTalkUsers = F::Array_SortByKeysArray($aTalkUsers, $aTalksId); return $aTalkUsers; }