Я использую один довольно сложный подготовленный оператор с различными условиями в предложении WHERE, и в какой-то момент мне действительно нужен тот же оператор с еще одним конкретным условием. Создание двух разных операторов — плохой подход, так как оба разделяют большую часть своей строки запроса, и когда я обновляю одно, мне нужно будет обновить и другое. До сих пор я пытался использовать это:
SELECT columns
FROM tables
WHERE manyConditions AND (specificColumn = ? OR ? = NULL)
В этом сценарии я мог бы связать один произвольный аргумент и NULL, чтобы сделать конкретное условие бесполезным для запросов, которые в нем не нуждаются ($pdo->execute([/* ... */, -1, null])
в то же время specificColumn
при связывании правильного значения и чего-то, что не равно NULL ($pdo->execute([/* ... */, 'specific value', true])
).
Это действительно грязный способ предотвращения дублирования кода, который заставляет меня связывать еще две переменные в большинстве случаев.
Есть ли более элегантный подход для предотвращения дублирования кода?
Это очень хороший вопрос от вдумчивого программиста.
Я бы сказал, что не существует такого же элегантного и простого решения. Но я могу предложить несколько подходов, и вы можете решить, какой из них лучше для вас.
Как было предложено в удаленном ответе, вы можете использовать условное построение запроса, что-то вроде
$sql = "SELECT columns FROM tables WHERE manyConditions";
$params = [$a,$b,$c];
if (!empty($d)) {
$sql .= " AND specificColumn = ?";
$params[] = $d;
}
$stmt = $pdo->prepare($sql);
$stmt->execute($params)
Других решений пока нет …