Существует несколько библиотек построителей запросов ActiveRecord. Некоторые из них автономны, а некоторые из них встроены в рамки. Однако у них действительно есть проблемы с предложениями WHERE и HAVING, когда дело доходит до сложного SQL. Отключение других баз данных - я пытаюсь придумать метод WHERE(), совместимый с MySQL и PostgreSQL, который мог бы устранить эти текущие потоки методов.
Далее следует длинный список идей и примеров, показывающих лучшее, что я мог придумать до сих пор. Однако я не могу решить все варианты использования, и я чувствую, что мое частное решение неряшливо. Любой, кто может ответить тем, что решает все эти проблемы, не только ответит на этот вопрос, но и будет отвечать за устранение проблемы, которая уже несколько лет преследует реализации PHP.
Общие операторы
= Equal
<> Not Equal
> Greater Than
< Less Than
>= Greater Than Or Equal
<= Less Than Or Equal
BETWEEN between values on right
NOT logical NOT
AND logical AND
OR logical OR
Пример Где предложения
SELECT ... FROM table...
WHERE column = 5
WHERE column > 5
WHERE column IS NULL
WHERE column IN (1, 2, 3)
WHERE column NOT IN (1, 2, 3)
WHERE column IN (SELECT column FROM t2)
WHERE column IN (SELECT c3 FROM t2 WHERE c2 = table.column + 10)
WHERE column BETWEEN 32 AND 34
WHERE column BETWEEN (SELECT c3 FROM t2 WHERE c2 = table.column + 10) AND 100
WHERE EXISTS (SELECT column FROM t2 WHERE c2 > table.column)
Существует множество распространенных форматов ActiveRecord, которые предложение where() использует в разных текущих библиотеках.
$this->db->where(array('session_id' => '?', 'username' => '?'));
$this->db->fetch(array($id, $username));
// vs with is_int($key)
$this->db->where(array('session_id', 'username'));
$this->db->fetch(array($id, $username));
// vs with is_string($where)
$this->db->where('session_id', '?');
$this->db->where('username');
$this->db->fetch(array($id, $username));
// vs with is_array($value)
$this->db->where('session_id', '?');
$this->db->where('username', array('Sam', 'Bob'));
$this->db->fetch(array($id));
Вот окончательный формат, который у меня есть до сих пор. Он должен обрабатывать группировку (...) AND (...)
, а также подготовленные параметры привязки оператора ( "?" И ": name" ).
function where($column, $op = '=', $value = '?', $group = FALSE){}
// Single line
$this->db->where('column > 5');
$this->db->where('column IS NULL');
// Column + condition
$this->db->where('column', '=');
// WHERE column = ? (prepared statement)
$this->db->where('column', '<>');
// WHERE column <> ? (prepared statement)
// Column + condition + values
$this->db->where('column', '=', 5);
// // WHERE column = 5
$this->db->where('column', 'IN', '(SELECT column FROM t2)');
// WHERE column IN (SELECT column FROM t2)
$this->db->where('column', 'IN', array(1,2,3));
// WHERE column IN (1, 2, 3)
$this->db->where('column', 'NOT IN', array(1,2,3));
// WHERE column NOT IN (1, 2, 3)
// column + condition + values + group
$this->db->where(
array(
array('column', '<', 20),
array('column', '>', 10)
),
NULL,
NULL,
$group = TRUE
);
// WHERE (column < 20 AND column > 10)
: UPDATE:
В ходе моего вопроса я понял, что ГДЕ и УСЛОВИЯ ОБСТОЯТЕЛЬСТВА только усложняются, чем глубже вы идете. Попытка абстрагировать даже 80% функций приведет к массивной библиотеке только для WHERE и HAVING. Как отмечает Билл, это просто не разумно для языка сценариев, такого как PHP.
Решение - это просто обработать часть WHERE вашего запроса. Пока вы используете "
вокруг своих столбцов, вы можете использовать тот же запрос WHERE в Postgre, SQLite и MySQL, поскольку они используют почти тот же синтаксис SQL. (Для MySQL вы должны str_replace()
их с тиком `).
Наступает момент, когда абстракция болит больше, чем помогает, ГДЕ условия - одно из таких мест.