¿Cómo combinar AND y OR en la cláusula WHERE utilizando un objeto de consulta?

21

Dado el SQL deseado a continuación, donde se deben cumplir Cond1 y Cond2 O se debe cumplir Cond3 para la selección, ¿cuál es la forma correcta de usar getQuery()para lograrlo?

SQL deseado: condición1 y condición2 entre paréntesis)

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

Con encadenamiento: especificando OR en el -> where ()

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

SQL resultante: (SQL falta paréntesis)

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

Con matrices que especifican OR en el -> where ()

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

SQL resultante: (SQL falta paréntesis)

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

Respuestas:

20

Incluyendo los paréntesis que se necesitan, con Chaining, produjo el SQL deseado:

Con encadenamiento: especificando OR y envolviendo Cond1 / 2 entre paréntesis

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

SQL resultante: (incluye paréntesis)

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

O use 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'));
PIB
fuente