Ограничить кэш активной записи CodeIgniter только одним объектом - PullRequest
0 голосов
/ 07 декабря 2011

Я использую CodeIgniter.

Допустим, у меня есть модель для текущего пользователя и модель для списка пользователей.В модели для списка пользователей я кеширую операторы WHERE, потому что если я этого не сделаю, мне придется применять их все снова после использования $ this-> db-> count_all_results (эта функция сбрасывает активные функции записи).Мне, конечно, они нужны и для $ this-> db-> get ('users').

Функции в модели списка пользователей для фильтрации пользователей выглядят так:

public function onlyWomen()
{
$this->db->start_cache();
$this->db->where('gender', '1');
$this->db->stop_cache();
}

Проблема в том, что я также работаю с моделью для текущего пользователя.Я подозреваю, что кэш, который я установил в модели списка пользователей, также копирует в текущую модель пользователя (я работаю с обеими одновременно, поэтому не могу очистить кэш при запуске с текущей моделью пользователя).Я думал, что активный кэш записей должен оставаться в объекте, в котором он называется.

Как мне обойти или разрешить это?

(Мой английский не так уж и плох, но в сочетании сэтот сложный материал, и я, возможно, не до конца понимаю объекты / классы, надеюсь, вы понимаете мою проблему ^^)

1 Ответ

1 голос
/ 07 декабря 2011

CodeIgniter эффективно создает синглтоны, когда вы загружаете классы, используя встроенный класс Loader (например, используя $this->load->database() или $this->load->model('user')).Вот почему активное кэширование записей остается постоянным между вашим списком пользователей и моделями пользователей.Не существует нестандартного способа обойти это.Вам нужно отредактировать основные файлы, чтобы реализовать решение.

Вместо того, чтобы создавать методы для построения запросов с помощью кэширования, почему бы вам не создать методы для построения и выполнения запросов?Вот пример того, что я имею в виду:

class Userlist extends CI_Model {

    public function get_women()
    {
        // Build and execute active record query
        $this->db->where('gender', '1');
        $query = $this->db->get('users');

        // Return results
        return $query->results();
    }

}

Редактировать: Добавление примера использования необязательных параметров для указания предложений where.

class Userlist extends CI_Model {

    public function get_users($gender = false, $limit = false)
    {
        // Build active record query
        if ($gender !== false) {
            $this->db->where('gender', $gender);
        }
        if ($limit !== false) {
            $this->db->limit($limit);
        }

        // Execute query
        $query = $this->db->get('users');

        // Return results
        return $query->results();
    }

}

Очевидно, что это можетнемного сложнее, но это общая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...