Codeigniter опустить пункт where для пустого критерия - PullRequest
2 голосов
/ 30 июня 2011

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

Например, когда заполнены все входные данные формы, запрос выглядит так:

SELECT * FROM (`posts`) WHERE `category` = 'technolgy' AND `author` = 'lila' AND `tags` = 'ebook'

Однако, если один или несколько входов пуст, я не получаю результатов.Например:

SELECT * FROM (`posts`) WHERE `category` = '' AND `author` = 'lila' AND `tags` = '' 

Я хочу, чтобы входные данные были необязательными, поэтому, например, если введено только author name, я могу вернуть записи, сделанные этим автором, независимо от категории и тегов.Как я могу опустить предложение and where, если оно пустое?

Примечание: предложение or_where не является решением, поскольку оно не возвращает точный запрос, если все входные данные фильтра заполнены.

Моя модель

function filter($form_values)
    {                       
        $query = $this->db->get('posts');           
        $this->db->where($form_values); //adds clause to all array items
        return $query->result();        
    }

Параметр функции представляет собой массив с входными значениями с моей точки зрения.Например,

$form_values = array('category' => $category, 'author' => $author, 'tags' => $tags);

и мой вид

$form_values = array (                  
                'category' => $this->input->post('category'),
                'author'   => $this->input->post('author'),
                'tags'     => $this->input->post('tags')
            );

$this->Records_model->filter($form_values);    

Я знаю, что в Codeigniter, если $_POST' пусто, они установлены в FALSE.Можно ли это использовать для достижения того, что я пытаюсь?Я не уверен, что я на правильном пути

1 Ответ

1 голос
/ 30 июня 2011

Вы правы, что $this->input->post() вернет FALSE, если значение $_POST не установлено.Если вы специально не хотите, чтобы IS NULL был частью запроса (который, как я верю, произойдет, если передать FALSE параметру 2 из where(), не уверен на 100%), просто отфильтруйте пустые значения:

function filter($form_values)
{              
    $form_values = array_filter($form_values);

    // NOTE:
    // where() needs to be called first, or your query won't use the WHERE clause

    // You may need to make sure there is at least one value in $form_values
    if ( ! empty($form_values)) // however you wish to check for a value
    {
        $this->db->where($form_values); //adds clause to all array items
    }

    $query = $this->db->get('posts');           

    return $query->result();        
}

http://php.net/manual/en/function.array-filter.php

Важная часть, на которую следует обратить внимание array_filter():

Если обратный вызов не предоставлен, все записи ввода равныЛОЖЬ (см. Преобразование в логическое значение) будет удален.

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