Оптимизация активной записи в CodeIgniter - PullRequest
1 голос
/ 02 апреля 2012

У меня очень сложная функция в одной из моих моделей КИ, поэтому я пытаюсь оптимизировать ее и сделать ее более устойчивой. Я не уверен, где именно проблема, поэтому я вставлю как оригинальный (рабочий) вариант, так и что я сделал, чтобы сделать это лучше. Я думаю, что по большей части это должно работать, но обв. Я ошибся где-то по пути.

Вот оригинальная функция:

public function get($data)
    {
        if (isset($data))
        {
            if (isset($data['sort']))
            {
                $sort = json_decode($data['sort'], true);
                $this->db->order_by($sort[0]['property'], $sort[0]['direction']);
            }

            if (isset($data['query']) && $data['query'] != '')
            {
                $fields = json_decode($data['fields'], true);
                $where = $fields[0] . " LIKE '%" . $data['query'] . "%'";
                unset($fields[0]);
                foreach ($fields as $field)
                {
                    $where .= ' OR ' . $field . ' LIKE ' . "'%" . $data['query'] . "%'";
                }
                $this->db->select('id, email, firstname, lastname, usertype, ts_created, ts_last_login, position');
                $this->db->from('users');
                $this->db->where($where);
                $this->db->limit($data['limit'], $data['start']);
                $query = $this->db->get();
                $result = $query->result_array();
            }
            else
            {
                $this->db->select('id, email, firstname, lastname, usertype, ts_created, ts_last_login, position');
                $this->db->from('users');
                $this->db->limit($data['limit'], $data['start']);
                $query = $this->db->get();
                $result = $query->result_array();
            }

            if ($result != null)
            {
                return $result;
            }
            else
            {
                return null;
            }
        }
        else
        {
            $query = $this->db->select('id, email, firstname, lastname, usertype, ts_created, ts_last_login, position');
            $query = $this->db->get('users');
            $result = $query->result_array();
            return $result;
        }
    }

И вот что я сделал:

public function get($data)
    {

        if (isset($data))
        {
            if (isset($data['sort']))
            {
                $sort = json_decode($data['sort'], true);
                $orderCoulmn = $sort[0]['property'];
                $orderDir = $sort[0]['direction'];
            }

        $limit = $data['limit'];

        $start = $data['start'];

        }

        $this->db->select('id, email, firstname, lastname, usertype, ts_created, ts_last_login, position');

    /*  if (!empty($where))
        {
            $this->db->where($where);
        }*/
        if (isset($data['query']) && $data['query'] != '' )
        {
            $fields = json_decode($data['fields'], true);
            //$this->db->like($fields[0], $data['query']);
            //unset($fields[0]);

            foreach ($fields as $filed)
            {
                $this->db->or_like($field, $data['query']);
            }
        }

        if (!empty($limit) && !empty($start))
        {
            $this->db->limit($limit, $start);
        }

        if (!empty($orderColumn) && !empty($orderDir))
        {
            $this->db->order_by($orderColumn, $orderDir);
        }

        $query = $this->db->get('users');
        $result = $query->result_array();

        return $result;
    }

Любые идеи, где может быть проблема в моем коде (второй)? Спасибо Лерон

1 Ответ

0 голосов
/ 02 апреля 2012

Я не вижу, что не так с вашим примером, но вот как я могу упростить вещи:

public function get($data)
{
    $this->db->select('id, email, firstname, lastname, usertype, ts_created, ts_last_login, position'); // same for every situation

    if (is_array($data)) // a little stricter than testing if it's set, could be a string.
    {
        $this->db->limit($data['limit'], $data['start']); // do anyhow if $data is an array

        if ($data['sort']) // if this evaluates to true, execute
        {
            $sort = json_decode($data['sort'], true);
            $this->db->order_by($sort[0]['property'], $sort[0]['direction']);
        }

        if ($data['query'])
        {
            $fields = json_decode($data['fields'], true);
            $where = "";
            $seperator = "";
            foreach($fields as $field)
            {
                $where .= "{$seperator}$field LIKE '%{$data['query']}%'";
                $seperator = ' OR '; // using this "seperator" approach, allows you to easily concat strings.
            }
            $this->db->where($where);
        }
    }

    // finally, get a result, with possible other db actions, depending on $data
    $query = $this->db->get('users');
    $result = $query->result_array();
    return $result;
}

Помните: KISS и DRY - ваши друзья;)

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