2016-10-24 1 views
0

J'utilise le propel ORM dans mon application PHP.Propel "AND NOT" requête

à la lecture des documents, je ne peux pas comprendre comment faire une demande de ce type:

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

Quelle est la façon la plus propre à effectuer cette demande en utilisant la logique pure de Propel?

Merci

+0

Logiquement, cela équivaut à col1 = 'xxx' ET (col2! = 1 OU col3! = 2) ... qui semble être plus facile à exprimer avec '-> combine (array ('cond2', 'cond3 '),' ou ', ...) ', puis combinez cela avec la condition 1,' et'. Je ne peux pas être plus utile, puisque je suis un DBA ... donc les ORM sont mon ennemi mortel. –

+0

Merci pour votre réponse. –

+0

Merci pour votre réponse. J'ai essayé de cette façon plus tôt, en utilisant combine() mais j'ai fait face à un comportement étrange: -> condition ('cond1', 'x! =?', 1) -> condition ('cond2', 'y! =? ', 2) -> condition (' cond3 ',' z! =? ', 3) -> combine (array (' cond1 ',' cond2 ',' cond3 '),' ou ',' cond12 ') résultats: SELECT ... ET (!!! (x = 1 ou y = 2) ou z = 3) qui ne veut pas vraiment la même chose .. –

Répondre

0

Votre requête équivaudrait à:

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

En supposant que vous utilisez propulsera 2, vous devriez être en mesure d'accomplir ce que vous voulez avec:

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

La requête complète que vous cherchez devrait être celle-ci:

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

Il crée:

  • un cond1 condition où col1 = 'xxx'
  • un cond2 état où de col2 = 1
  • un cond3 condition où col3! = 2

Ensuite, il combine cond2 et cond3 avec un opérateur ou dans une nouvelle cond23, de sorte que

cond23 = cond2 or cond3 

et combine cond23 et cond1 avec un opérateur et, de sorte que la requête finale sera

where(cond1 and cond23)