2016-10-24 7 views
0

PHPアプリケーションでpropel ORMを使用しています。Propel "AND NOT"クエリ

ドキュメントを読んでから、私はこのタイプの要求を行う方法を見つけ出すことはできません。

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

純粋Propelのロジックを使用してこの要求を実行するためのクリーンな方法は何ですか?

おかげ

+0

論理的には、これはcol1 = 'xxx' AND(col2!= 1 OR col3!= 2)...と同じですが、これは ' - > combine(array( 'cond2'、 'cond3 ')、'、 '、...) 'を返し、条件1、'と 'を組み合わせます。私はDBAであるので、もう助けになることはできません... ORMは私の死の敵です。 –

+0

あなたの答えをありがとう。 –

+0

ありがとうございます。私は以前Combined()を使っていましたが、奇妙な振る舞いに直面しました: - >条件( 'cond1'、 'x!=?'、1) - >条件( 'cond2'、 'y!=? '、2) - >コンディション(' cond3 '、' z!=? '、3) - >コンビネーション(array(' cond1 '、' cond2 '、' cond3 ')'、 'cond12') 結果: SELECT ... AND(!!!(X = 1またはy = 2)またはZ = 3)実際には同じものではありません ... –

答えて

0

に相当しますあなたのクエリ:あなたは2を推進使用していると仮定すると、

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

は、あなたが欲しいものを達成することができるはずで:

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

探している完全なクエリは、次のとおりです。

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

それが作成されます。

  • COL1 = 'XXX'
  • COND1条件 COL2 = 1
  • COND2条件COND3条件を! col3!= 2

それは、新しいcond23又はオペレータとCOND2COND3を組み合わせ

cond23 = cond2 or cond3 

ようにオペレータとcond23COND1を兼ね備え最終的なクエリは

where(cond1 and cond23) 
となります3210