Функция CodeIgniter Active Record or_where () выдает AND в sql? - PullRequest
0 голосов
/ 14 марта 2012

Я написал запрос на активную запись в CodeIgniter, а затем понял, что мне нужно использовать оператор OR с предложениями WHERE. Поэтому я просмотрел документы и обнаружил, что сделал то, что хотел. Но когда я использую его, он выдает AND на выходе. Я не мог найти другие вопросы по этому вопросу.

Я использую CodeIgniter: 2.1.0

Вот мой код (слегка урезанный):

$ this-> db-> выберите (, ложь "р *.");

$this->db->from('projects p');
$this->db->join('customers c', 'p.c_id = c.c_id','left outer');

if(isset($options['add_root']))
  $this->db->or_where('p.p_id=',1,FALSE);

//Get top level projects by default (1) or whatever parent is specified.
if(isset($options['p_id']))
  $this->db->where('p.p_id=',$options['p_id'],false);

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

Ответы [ 2 ]

1 голос
/ 14 марта 2012

В порядке запроса, который вы пытаетесь выполнить, есть небольшая ошибка. Вы можете добавить несколько предложений 'where', которые будут преобразованы в запрос с 'AND' между ними. Но если вы хотите использовать «ИЛИ», вместо этого вы используете «or_where».

В своем запросе вы использовали предложение 'or_where', которое является правильным, но после этого вы использовали 'where', которое буквально суммирует предыдущий запрос. Итак, сначала вы должны использовать предложение 'where', а затем использовать предложение 'or_where'.

Просто измените порядок, и он будет работать.

1 голос
/ 14 марта 2012

Не думаю, что вам нужно or_where.Я думаю, вам нужно лучше, если / иначе в PHP.

Логика, которую вы, вероятно, хотите:

if(isset($options['p_id']))
{
    // if p_id is set, then look for p_id
    $this->db->where('p.p_id=',$options['p_id'],false);
    // if p_id and add_root are set, then look for p_id OR p_id = 1
    if(isset($options['add_root']))
        $this->db->or_where('p.p_id=',1,FALSE);
}
elseif(isset($options['add_root']))
{
    // look for p_id = 1 only
    $this->db->where('p.p_id=',1,FALSE);
}

Поскольку or_where сначала это просто значение по умолчанию where, а затемпоследующие where являются значениями по умолчанию: «и».

Вы также можете написать выше с серией elseif, но я считаю это менее понятным:

if(isset($options['p_id']) && isset($options['add_root']))
    $this->db
       ->where('p.p_id=',$options['p_id'],false)
       ->or_where('p.p_id=',1,FALSE);
elseif(isset($options['p_id']) || isset($options['add_root']))
    $this->db
       ->where('p.p_id=',
               // if add_root is set, then 1, otherwise p_id
               (isset($options['add_root'])?1:$options['p_id']),false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...