Як поєднати AND і OR в пункті WHERE, використовуючи об’єкт запиту?


21

З огляду на потрібний нижче SQL, де Cond1 та Cond2 повинні бути виконані АБО Cond3 повинні бути дотримані для вибору, який правильний спосіб використовувати getQuery()для його досягнення?

Бажаний SQL: Умова1 та Умова2 у дужках)

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

АБО використовуйте 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'));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.