Как объединить AND и OR в предложении WHERE, используя объект запроса?

21

Принимая во внимание требуемый SQL ниже, где должны быть соблюдены Cond1 и Cond2 ИЛИ Cond3 должен быть соблюден для выбора, какой правильный способ использовать getQuery()для его достижения?

Требуемый SQL: Condition1 и Condition2 в скобках)

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

С цепочкой: указав ИЛИ в -> где ()

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

Результирующий SQL: (в SQL отсутствуют скобки)

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

С Массивами, указывающими ИЛИ в -> где ()

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

Результирующий SQL: (в SQL отсутствуют скобки)

SELECT * FROM scm_myTable
WHERE condition1 = true OR condition2 = true OR condition3 = true
ВВП
источник

Ответы:

20

Включение скобок, которые необходимы, с Chaining, производит желаемый SQL:

С цепочкой: указание ИЛИ и включение Cond1 / 2 в скобки

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

Результирующий SQL: (включает круглые скобки)

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

ИЛИ использовать или Где / и Где

$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'));
ВВП
источник