Динамическое ИЛИ / И в запросе - PullRequest
2 голосов
/ 15 августа 2011

Исходя из выбора пользователя, мне нужно отфильтровать результаты в моем запросе, но я застрял в том, как правильно реализовать динамические операторы OR после моего AND.В настоящее время я использую Active Record в CodeIgniter, но это, возможно, придется изменить.

Мне необходимо создать следующий фрагмент: "WHERE city.id = 9 AND (eventType = 8 или eventType = 9)"

  1. если нет операторов OR, тогда мне не нужны AND
  2. , могут быть 1-n операторы OR

Мой код в настоящее времявыглядит следующим образом:

$this->db->where('city.id =', $cityID);

    if ($eventTypes != NULL){
               foreach ($eventTypes as $item){
                    $eventTypeID = intval($item); 
                    $this->db->or_where('eventtype.id =', $eventTypeID);
               }
           }

Это дает: ГДЕ city.id = 13 ИЛИ eventtype.id = 6 ИЛИ eventtype.id = 8 ... поэтому мне нужно AND (

1 Ответ

1 голос
/ 15 августа 2011

Codeigniter "ActiveRecord" (airquotes ...) Класс довольно ограничен и не очень хорошо справляется с более продвинутой AND / OR областью видимости, и указывает вам обратно на raw sql для " более сложные "запросы".

Я бы сформулировал вашу собственную строку WHERE для построения конкретного запроса, который вы хотите, а затем просто используйте

$this->db->where($sql)

пример ...

$where = "city.id = $cityID ";

if ($eventTypes != NULL)
{
    $where .= "AND ( ";
    foreach ($eventTypes as $i => $type)
    {
        $eventTypeID = intval($type);

        // if it's not the first element
        // (assumes $eventTypes is non-associative)
        if ($i !== 0)
        {
            $where .= "OR ";
        }
        $where .= "eventtype.id = $eventTypeID ";
    }
    $where .= " ) ";
}

$this->db->where($where);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...