Продвигать «И НЕ» запрос

#php #mysql #orm #propel

Вопрос:

Я использую propel ORM в своем PHP-приложении.

Прочитав документы, я не могу понять, как сделать запрос такого типа:

 SELECT x FROM table where col1 = 'xxx' and not(col2=1 AND col3=2);
 

Каков самый чистый способ выполнить этот запрос с использованием чистой логики продвижения?

Спасибо

Комментарии:

1. Логически это эквивалентно col1 = ‘xxx’ И (col2 != 1 ИЛИ col3 != 2)… что , по-видимому, было бы проще выразить с ->combine(array('cond2', 'cond3'), 'or',...) помощью, а затем объединить это с условием 1, and . Я не могу быть более полезным, так как я администратор базы данных… так что ОРМЫ-мой смертельный враг.

2. Спасибо вам за ваш ответ. Я пытался сделать это раньше , используя combine (), но столкнулся со странным поведением: ->условие(‘cond1’, ‘x != ?’, 1) ->>условие(‘cond2’, ‘y != ?’, 2) ->>>условие(‘cond3’, ‘z != ?’, 3) ->>>>объединить(массив(‘cond1’, ‘cond2’, ‘cond3’), ‘или’, ‘cond12’) результаты: ВЫБЕРИТЕ … И ((x!=1 ИЛИ y!=2)ИЛИ z!=3), что на самом деле не одно и то же..

3. Уупс, был идиотский момент, я думаю, на самом деле, это совершенно одно и то же…

Ответ №1:

Полный запрос, который вы ищете, должен быть следующим:

 $books = TableQuery::create()
    ->condition('cond1', 'col1 = ?', 'xxx')
    ->condition('cond2', 'col2 != ?', 1)
    ->condition('cond3', 'col3 != ?', 2)
    ->combine(array('cond2', 'cond3'), 'or', 'cond23')
    ->where(array('cond1', 'cond23'), 'and')
    ->find();
 

Это создает:

  • условие cond1, где col1 = ‘xxx’
  • условие cond2, где col2 != 1
  • условие cond3, где col3 != 2

Затем он объединяет cond2 и cond3 с оператором или в новом cond23, так что

 cond23 = cond2 or cond3
 

и объединяет cond23 и cond1 с оператором и, так что окончательный запрос будет

 where(cond1 and cond23)
 

Ответ №2:

Ваш запрос будет эквивалентен:

 SELECT x FROM table where col1 = 'xxx' and (col2 != 1 OR col3 != 2);
 

Предполагая, что вы используете propel 2, вы должны быть в состоянии выполнить то, что вы хотели бы с помощью:

 $result = TableQuery::create()
    ->filterByCol1('xxx')
    ->filterByCol2(1, Criteria:NOT_EQUAL)
    ->_or()
    ->filterByCol3(2, Criteria:NOT_EQUAL)
    ->find();