Jak łączyć AND i OR w klauzuli WHERE za pomocą obiektu zapytania?

21

Biorąc pod uwagę pożądany kod SQL poniżej, gdzie Cond1 i Cond2 muszą zostać spełnione LUB Cond3 musi zostać spełniony w celu wyboru, jaki jest właściwy sposób getQuery()na osiągnięcie tego?

Pożądany SQL: Warunek 1 i Warunek 2 w nawiasach)

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

Z łańcuchem: określenie OR w -> where ()

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

Wynikowy SQL: (SQL nie zawiera nawiasów)

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

Z tablicami określającymi OR w -> where ()

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

Wynikowy SQL: (SQL nie zawiera nawiasów)

SELECT * FROM scm_myTable
WHERE condition1 = true OR condition2 = true OR condition3 = true
PKB
źródło

Odpowiedzi:

20

Dołączenie nawiasów, które są potrzebne, wraz z łańcuchem, dało pożądany kod SQL:

Z łańcuchem: określanie OR i zawijanie Cond1 / 2 w nawiasach

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

Wynikowy kod SQL: (zawiera nawiasy)

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

LUB użyj lub Gdzie / i Gdzie

$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'));
PKB
źródło