Comment combiner des AND et des OR dans la clause WHERE à l'aide d'un objet de requête?

21

Étant donné le SQL souhaité ci-dessous, où Cond1 et Cond2 doivent être remplies OU Cond3 doit être respecté pour la sélection, quelle est la bonne façon d'utiliser getQuery()pour y parvenir?

SQL souhaité: Condition1 et Condition2 entre parenthèses)

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

Avec chaînage: spécification OU dans le -> où ()

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

SQL résultant: (il manque des parenthèses dans SQL)

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

Avec des tableaux spécifiant OU dans le -> où ()

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

SQL résultant: (il manque des parenthèses dans SQL)

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

Réponses:

20

L'inclusion des parenthèses nécessaires, avec le chaînage, a produit le SQL souhaité:

Avec chaînage: spécification OU et encapsulation Cond1 / 2 entre parenthèses

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

SQL résultant: (inclut les parenthèses)

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

OU utilisez orOù / etOù

$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
la source