#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();