Komplexe WHERE-Klausel mit Zend_Db verwenden mehrerer UND ODER Operatoren
Möchte ich generieren, diese komplexe WHERE-Klausel in Zend_Db:
SELECT *
FROM 'products'
WHERE
status = 'active'
AND
(
attribute = 'one'
OR
attribute = 'two'
OR
[...]
)
;
Habe ich versucht, dieses:
$select->from('product');
$select->where('status = ?', $status);
$select->where('attribute = ?', $a1);
$select->orWhere('attribute = ?', $a2);
und produziert:
SELECT `product`.*
FROM `product`
WHERE
(status = 'active')
AND
(attribute = 'one')
OR
(attribute = 'two')
;
Ich habe herauszufinden, eine Methode, dieses Werk aber für mich war es eine Art von "Betrug" mit PHP verbinden "ODER" - Klauseln erste und kombinieren Sie Sie dann mit Zend_Db wo () - Klausel. PHP-code:
$WHERE = array();
foreach($attributes as $a):
#WHERE[] = "attribute = '" . $a . "'";
endforeach;
$WHERE = implode(' OR ', $WHERE);
$select->from('product');
$select->where('status = ?', $status);
$select->where($WHERE);
Dass hergestellt, was ich suchte. Aber ich bin mal gespannt, ob es einen "offiziellen" Weg zu bekommen, dass komplexe WHERE-Anweisung (die ist wirklich nicht zu Komplex, einfach nur mit einigen Klammern) mit Hilfe der Zend_Db-tool, anstatt die Kombination von PHP in ersten.
Prost!
InformationsquelleAutor der Frage jmbertucci | 2010-12-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wäre dies der "offizielle" Weg, um Ihnen den Klammern angegeben (siehe Beispiel #20 in der
Zend_Db_Select
Dokumentation):So, was Sie tun, scheint vernünftig, da Sie nicht wissen, wie viele Attribute Sie haben vor der Zeit.
InformationsquelleAutor der Antwort karim79
Wenn die gewählte Antwort würden Sie brauchen, zu erinnern, zu zitieren, die Werte vor der Erstellung der Abfrage zum Schutz vor SQL-injection.
Eine weitere option, die verwendet Zend Db Select um die Abfrage zu erstellen und zitiert auch die Werte wären, es zu tun in 2 Stufen:
Diese Weise Zend Db Select unterstützt alle SQL-generatation. Eine alte Frage, aber ich hoffe diese Idee könnte von nutzen sein, um jemanden mit einem ähnlichen problem.
InformationsquelleAutor der Antwort Alasdair Shields
Ich diese Lösung verwenden, und es scheint, als arbeiten wollte.
InformationsquelleAutor der Antwort Vulman
Wenn Ihr Attribut ist die gleiche Tabelle, Spalte und Sie wollen, check it für gleich mehrere Werte, als Sie verwenden können, IN :
oder
Sonst sehe ich keine alternative zu der Entscheidung oben mit
"attribute = $a1 OR attribute = $a2"
InformationsquelleAutor der Antwort FlameStorm