/** * Получить список голосований в топике-опросе по списку ID * * @param array $aTopicsId - Список ID топиков * @param int $iUserId - ID пользователя * * @return array */ public function GetTopicsQuestionVoteByArray($aTopicsId, $iUserId) { if (!$aTopicsId) { return array(); } if (Config::Get('sys.cache.solid')) { return $this->GetTopicsQuestionVoteByArraySolid($aTopicsId, $iUserId); } if (!is_array($aTopicsId)) { $aTopicsId = array($aTopicsId); } $aTopicsId = array_unique($aTopicsId); $aTopicsQuestionVote = array(); $aTopicIdNotNeedQuery = array(); // * Делаем мульти-запрос к кешу $aCacheKeys = F::Array_ChangeValues($aTopicsId, 'topic_question_vote_', '_' . $iUserId); if (false !== ($data = E::ModuleCache()->Get($aCacheKeys))) { // * проверяем что досталось из кеша foreach ($aCacheKeys as $iIndex => $sKey) { /** @var ModuleTopic_EntityTopicQuestionVote[] $data */ if (array_key_exists($sKey, $data)) { if ($data[$sKey]) { $aTopicsQuestionVote[$data[$sKey]->getTopicId()] = $data[$sKey]; } else { $aTopicIdNotNeedQuery[] = $aTopicsId[$iIndex]; } } } } // * Смотрим каких топиков не было в кеше и делаем запрос в БД $aTopicIdNeedQuery = array_diff($aTopicsId, array_keys($aTopicsQuestionVote)); $aTopicIdNeedQuery = array_diff($aTopicIdNeedQuery, $aTopicIdNotNeedQuery); $aTopicIdNeedStore = $aTopicIdNeedQuery; if ($aTopicIdNeedQuery) { if ($data = $this->oMapper->GetTopicsQuestionVoteByArray($aTopicIdNeedQuery, $iUserId)) { foreach ($data as $oTopicVote) { // * Добавляем к результату и сохраняем в кеш $aTopicsQuestionVote[$oTopicVote->getTopicId()] = $oTopicVote; E::ModuleCache()->Set($oTopicVote, "topic_question_vote_{$oTopicVote->getTopicId()}_{$oTopicVote->getVoterId()}", array(), 60 * 60 * 24 * 4); $aTopicIdNeedStore = array_diff($aTopicIdNeedStore, array($oTopicVote->getTopicId())); } } } // * Сохраняем в кеш запросы не вернувшие результата foreach ($aTopicIdNeedStore as $sId) { E::ModuleCache()->Set(null, "topic_question_vote_{$sId}_{$iUserId}", array(), 60 * 60 * 24 * 4); } // * Сортируем результат согласно входящему массиву $aTopicsQuestionVote = F::Array_SortByKeysArray($aTopicsQuestionVote, $aTopicsId); return $aTopicsQuestionVote; }
/** * Получить список отношений друзей * * @param int|array $aUsersId - Список ID пользователей проверяемых на дружбу * @param int $iUserId - ID пользователя у которого проверяем друзей * * @return ModuleUser_EntityFriend[] */ public function GetFriendsByArray($aUsersId, $iUserId) { if (Config::Get('sys.cache.solid')) { return $this->GetFriendsByArraySolid($aUsersId, $iUserId); } if (!$aUsersId) { return array(); } elseif (!is_array($aUsersId)) { $aUsersId = array($aUsersId); } else { $aUsersId = array_unique($aUsersId); } $aFriends = array(); $aUserIdNotNeedQuery = array(); // * Делаем мульти-запрос к кешу $aCacheKeys = F::Array_ChangeValues($aUsersId, 'user_friend_', '_' . $iUserId); if (false !== ($data = E::ModuleCache()->Get($aCacheKeys))) { // * проверяем что досталось из кеша foreach ($aCacheKeys as $iIndex => $sKey) { if (array_key_exists($sKey, $data)) { if ($data[$sKey]) { $aFriends[$data[$sKey]->getFriendId()] = $data[$sKey]; } else { $aUserIdNotNeedQuery[] = $aUsersId[$iIndex]; } } } } // * Смотрим каких френдов не было в кеше и делаем запрос в БД $aUserIdNeedQuery = array_diff($aUsersId, array_keys($aFriends)); $aUserIdNeedQuery = array_diff($aUserIdNeedQuery, $aUserIdNotNeedQuery); $aUserIdNeedStore = $aUserIdNeedQuery; if ($aUserIdNeedQuery) { if ($data = $this->oMapper->GetFriendsByArrayId($aUserIdNeedQuery, $iUserId)) { foreach ($data as $oFriend) { // * Добавляем к результату и сохраняем в кеш $aFriends[$oFriend->getFriendId($iUserId)] = $oFriend; /** * Тут кеш нужно будет продумать как-то по другому. * Пока не трогаю, ибо этот код все равно не выполняется. * by Kachaev */ E::ModuleCache()->Set($oFriend, "user_friend_{$oFriend->getFriendId()}_{$oFriend->getUserId()}", array(), 'P4D'); $aUserIdNeedStore = array_diff($aUserIdNeedStore, array($oFriend->getFriendId())); } } } // * Сохраняем в кеш запросы не вернувшие результата foreach ($aUserIdNeedStore as $sId) { E::ModuleCache()->Set(null, "user_friend_{$sId}_{$iUserId}", array(), 'P4D'); } // * Сортируем результат согласно входящему массиву $aFriends = F::Array_SortByKeysArray($aFriends, $aUsersId); return $aFriends; }
/** * Получить список отношений разговор-юзер по списку айдишников * * @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; }
/** * Получить список отношений блог-юзер по списку айдишников * * @param array|int $aBlogId Список ID блогов * @param int $iUserId ID пользователя * * @return ModuleBlog_EntityBlogUser[] */ public function GetBlogUsersByArrayBlog($aBlogId, $iUserId) { if (!$aBlogId) { return array(); } if (Config::Get('sys.cache.solid')) { return $this->GetBlogUsersByArrayBlogSolid($aBlogId, $iUserId); } if (!is_array($aBlogId)) { $aBlogId = array(intval($aBlogId)); } $aBlogId = array_unique($aBlogId); $aBlogUsers = array(); $aBlogIdNotNeedQuery = array(); // * Делаем мульти-запрос к кешу $aCacheKeys = F::Array_ChangeValues($aBlogId, 'blog_relation_user_', '_' . $iUserId); if (false !== ($data = E::ModuleCache()->Get($aCacheKeys))) { // * проверяем что досталось из кеша foreach ($aCacheKeys as $iIndex => $sKey) { if (array_key_exists($sKey, $data)) { if ($data[$sKey]) { $aBlogUsers[$data[$sKey]->getBlogId()] = $data[$sKey]; } else { $aBlogIdNotNeedQuery[] = $aBlogId[$iIndex]; } } } } // * Смотрим каких блогов не было в кеше и делаем запрос в БД $aBlogIdNeedQuery = array_diff($aBlogId, array_keys($aBlogUsers)); $aBlogIdNeedQuery = array_diff($aBlogIdNeedQuery, $aBlogIdNotNeedQuery); $aBlogIdNeedStore = $aBlogIdNeedQuery; if ($aBlogIdNeedQuery) { if ($data = $this->oMapper->GetBlogUsersByArrayBlog($aBlogIdNeedQuery, $iUserId)) { foreach ($data as $oBlogUser) { // * Добавляем к результату и сохраняем в кеш $aBlogUsers[$oBlogUser->getBlogId()] = $oBlogUser; E::ModuleCache()->Set($oBlogUser, "blog_relation_user_{$oBlogUser->getBlogId()}_{$oBlogUser->getUserId()}", array(), 'P4D'); $aBlogIdNeedStore = array_diff($aBlogIdNeedStore, array($oBlogUser->getBlogId())); } } } // * Сохраняем в кеш запросы не вернувшие результата foreach ($aBlogIdNeedStore as $sId) { E::ModuleCache()->Set(null, "blog_relation_user_{$sId}_{$iUserId}", array(), 'P4D'); } // * Сортируем результат согласно входящему массиву $aBlogUsers = F::Array_SortByKeysArray($aBlogUsers, $aBlogId); return $aBlogUsers; }
function func_array_sort_by_keys($array, $aKeys) { return F::Array_SortByKeysArray($array, $aKeys); }
/** * Список комментов по ID * * @param array|int $aCommentsId Список ID комментариев * * @return array */ public function GetCommentsByArrayId($aCommentsId) { if (!$aCommentsId) { return array(); } if (Config::Get('sys.cache.solid')) { return $this->GetCommentsByArrayIdSolid($aCommentsId); } if (!is_array($aCommentsId)) { $aCommentsId = array($aCommentsId); } $aCommentsId = array_unique($aCommentsId); $aComments = array(); $aCommentIdNotNeedQuery = array(); // * Делаем мульти-запрос к кешу $aCacheKeys = F::Array_ChangeValues($aCommentsId, 'comment_'); if (false !== ($data = E::ModuleCache()->Get($aCacheKeys))) { // * Проверяем что досталось из кеша foreach ($aCacheKeys as $iIndex => $sKey) { if (array_key_exists($sKey, $data)) { if ($data[$sKey]) { $aComments[$data[$sKey]->getId()] = $data[$sKey]; } else { $aCommentIdNotNeedQuery[] = $aCommentsId[$iIndex]; } } } } // * Смотрим каких комментов не было в кеше и делаем запрос в БД $aCommentIdNeedQuery = array_diff($aCommentsId, array_keys($aComments)); $aCommentIdNeedQuery = array_diff($aCommentIdNeedQuery, $aCommentIdNotNeedQuery); $aCommentIdNeedStore = $aCommentIdNeedQuery; if ($aCommentIdNeedQuery) { if ($data = $this->oMapper->GetCommentsByArrayId($aCommentIdNeedQuery)) { foreach ($data as $oComment) { // * Добавляем к результату и сохраняем в кеш $aComments[$oComment->getId()] = $oComment; E::ModuleCache()->Set($oComment, "comment_{$oComment->getId()}", array(), 'P4D'); $aCommentIdNeedStore = array_diff($aCommentIdNeedStore, array($oComment->getId())); } } } // * Сохраняем в кеш запросы не вернувшие результата foreach ($aCommentIdNeedStore as $nId) { E::ModuleCache()->Set(null, "comment_{$nId}", array(), 'P4D'); } // * Сортируем результат согласно входящему массиву $aComments = F::Array_SortByKeysArray($aComments, $aCommentsId); return $aComments; }