Wie kombiniere ich ANDs und ORs in der WHERE-Klausel mit einem Query-Objekt?


21

In Anbetracht der gewünschten SQL unten, in der Kond1 und Kond2 erfüllt sein müssen ODER Kond3 für die Auswahl erfüllt sein muss, wie kann dies korrekt erreicht werden getQuery()?

Gewünschtes SQL: Bedingung1 und Bedingung2 in Klammern)

SELECT * FROM #__myTable 
WHERE (condition1=true AND condition2=true) OR condition3=true

Mit Verkettung: Geben Sie OR in das -> where () ein.

$query = $db->getQuery(true);
$query->select('* FROM #__myTable')
->where('condition1 = true AND condition2 = true','OR')
->where('condition3 = true');

Resultierende SQL: (SQL fehlt in Klammern)

SELECT * FROM scm_myTable
WHERE condition1 = true AND condition2 = true OR condition3 = true

Mit Arrays , die OR in -> where () angeben

$query = $db->getQuery(true);
$conditions12 = array(
    'condition1 = true',
    'condition2 = true'
);
$conditions3 = array(
    'condition3 = true'
);
$query->select('* FROM #__myTable')
->where($conditions12, 'OR')
->where($conditions3);

Resultierende SQL: (SQL fehlt in Klammern)

SELECT * FROM scm_myTable
WHERE condition1 = true OR condition2 = true OR condition3 = true

Antworten:


20

Das Einbeziehen der benötigten Klammern in Chaining ergab die gewünschte SQL:

Mit Verkettung: Geben Sie OR an und setzen Sie Cond1 / 2 in Klammern

$query = $db->getQuery(true);
$query->select('* FROM #__myTable')
->where('(condition1 = true AND condition2 = true)','OR')
->where('condition3 = true');

Resultierendes SQL: (enthält Klammern)

SELECT * FROM scm_myTable
WHERE (condition1 = true AND condition2 = true) OR condition3 = true

ODER benutze orWhere / andWhere

$query = $db->getQyery(true);
$query->select('*')
->from($db->quoteName('#__myTable'))
->where($db-quoteName('condition3') . ' = TRUE')
->orWhere(array($db->quoteName('condition1') . ' = TRUE', $db->quoteName('condition2') . ' = TRUE'));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.