2012-02-22 12 views
7

Utilizzando modelli della collezione Magentos, come devo fare per l'aggiunta di una query parte/filtro come questo:Magento collection - filtro da diversi campi

WHERE (main_table.x < 1 OR (main_table.x - main_table.y) >= 5) 

Aggiornamento ora sto correndo questo:

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

Risultato:

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

Il problema è che io non riesco a ottenere di legarsi a $qty:qty

Update 2 ho finito con questo, da quando ho avuto bisogno del OR tra parentesi

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

Ho aggiornato il post – Vitamin

risposta

6

Quando si utilizza il getSelect metodo stai bypassando l'interfaccia di raccolta del modello di Magento. A volte questo è l'unico modo per ottenere la query di selezione esatta che desideri, ma tieni presente che potrebbe non essere al 100% con ciò che sta facendo l'interfaccia del modello di Magento.

Quando si utilizza il metodo bindParamater si sta utilizzando l'interfaccia del modello Magento. Non riesco a parlare con perché non funziona, ma ho il sospetto che l'oggetto di selezione di Zend e gli oggetti di raccolta del modello Magento leghino i parametri in momenti diversi, e in un modo diverso.

Per ottenere i risultati desiderati, saltare il metodo bindParamater e utilizzare la sostituzione del parametro più semplice ? del metodo orWhere.

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

Questo funziona perfettamente, grazie! – Vitamin

3

Blockquote Il problema è che io non riesco a ottenere di legarsi $ qty a: qty

Beh, è ​​in realtà non è un problema che è il motore/MySQL modo DOP sta lavorando con preparazione della dichiarazione della query e parametri di binding, che vengono inviati separatamente e successivamente all'esecuzione della query.

quindi non è sul livello di astrazione DB per generare l'istruzione query finale se si sta utilizzando Bind Parametri

Vai a questa stackoverflow question e PDO manual.

+1

Quindi stai dicendo che funziona, sto solo stampando la query prima che venga eseguita, ottenendo così risultati fuorvianti? – Vitamin

+0

Sì, non vedrete la stringa di query con il binding interpolato che, ovviamente, potrebbe irritare. Per il doppio controllo, ridurre la query di raccolta con uno sku o un ID prodotto con param vincolanti. – ngocanhdoan

Problemi correlati