2012-02-22 5 views
7

によるフィルタMagentoのコレクション私はこのようなクエリの一部/フィルタを追加して行くべきかMagentosコレクションのモデルを使用して、いくつかのフィールド

$this->getSelect() 
    ->where('main_table.x < 1') 
    ->orWhere('(main_table.x - main_table.y) >= :qty'); 
$this->addBindParam(':qty', $qty); 

結果:

SELECT ... WHERE ... AND ... AND (main_table.x < 1) OR ((main_table.x - main_table.y) >= :qty) ORDER BY ... 

問題は、私は$qty私は括弧

$this->getSelect()->where('(main_table.x < 1 OR (main_table.x - main_table.y) >= ?)', $qty); 
+0

投稿を更新しました – Vitamin

答えて

6

あなたがgetSelectを使っ内ORを必要とするので、私は、これで終わった アップデート2

:qtyにバインドするように見えることはできませんということですメソッドでは、Magentoのモデルコレクションインターフェイスをバイパスしています。時には、これは、あなたが望む正確な選択クエリを得るための唯一の方法ですが、Magentoモデルインターフェースが何をしているのかで100%ゲル化しないかもしれないことに留意してください。

bindParamaterメソッドを使用するときは、Magentoモデルインターフェイスを使用しています。私はと話すことができませんなぜそれは動作していませんが、私はZendの選択オブジェクトとMagentoモデルのコレクションオブジェクトが異なる時間に、そして異なる方法でパラメタをバインドすると思われます。

希望する結果を得るには、bindParamaterメソッドをスキップし、orWhereメソッドのより簡単な?パラメータ置換を使用します。

$this->getSelect() 
    ->where('main_table.x < 1') 
    ->orWhere('(main_table.x - main_table.y) >= ?',$qty); 
+0

これは完璧に動作します、ありがとう! – Vitamin

3

BLOCKQUOTE問題は、私は$数量をバインドするように見えることはできませんということです。数量

まあ、それは実際にはPDO/MySQLのエンジンが作業している方法だ問題ではありませんクエリステートメントの準備とバインディングパラメータ(個別にサブミットされる)と、その後のクエリの実行が含まれます。

あなたはバインドパラメータ

を使用しているのであれば、それは、最終的なクエリ文を生成するために、DB抽象化層の上にはありません。このstackoverflow questionPDO manualを参照してください。

+1

それはうまくいくと言っているのですが、実行する前にクエリを印刷しているだけなので、誤解を招く結果になります。 – Vitamin

+0

はい、当然のことながら、補間されたバインディングを含むクエリ文字列は表示されません。二重検査の場合は、バインディングparamを使用してスキューまたはプロダクトIDで収集クエリを減らします。 – ngocanhdoan

関連する問題