2011-02-06 2 views
2

Я ищу механизм построения запросов для PHP (не ORM!), Который бы удовлетворял некоторым критериям, указанным ниже. К сожалению, после изучения Doctrine, Propel, Adodb, Zend_Db и т. Д. Я не смог найти ни одного, который действительно подходит для профиля - они либо слишком абстрактны (мне не нужна абстракция на уровне ORM), либо не поддерживают достаточно функций , Мне нужна библиотека, которая позволила бы мне запрограммировать SQL-запрос - мне даже не нужно его запускать, хотя это тоже будет хорошо.PHP SQL Query building engine

Я действительно хотел бы избежать повторного использования колеса, поэтому, если вы знаете что-то, что соответствует профилю, пожалуйста, принесите его вперед. Если вы думаете, что один из названных выше подходит (и я пропустил это), пожалуйста, скажите мне тоже.

ДОЛЖЕН (если библиотека не имеет его, это не полезно для меня):

  • Поддержка PHP 5.2 (с пространствами имен библиотека не может быть использована в настоящее время, к сожалению)
  • поддержки программная генерация запросов, в том числе отдельных выражений, порядок-BY, LIMIT, групповые мимо, имеющие, союзы, внешние соединения и т.д.
  • Поддержка Mysql, Oracle OCI8, MSSQL, DB2, Postrges
  • поддержки здание под названием параметризованных запросов & подготовленные заявления
  • Поддержка добавления условия/присоединяется к динамически в любой точке
  • Поддержка типов данных, таких как DateTime и т.д. - например, правильно форматирование входящих/исходящих данных, использовать правильные функции сравнения, если это необходимо, и т.д. (и, конечно, надлежащего цитирую). Мы знаем типы всех полей в коде, поэтому библиотека должна позволять нам сообщать, что такое каждое поле.
  • Автономные (простой в использовании без тонн других классов поддержки)
  • Простота расширения и лицензии позволяет расширить на BSD-подобные термины
  • Чистый PHP 5 код (не PHP 4 объекта-по-исх хлама, и т.д.)

приятно иметь (мы могли бы реализовать, что на вершине «должен иметь» S, но был бы счастливее, если бы это было уже сделано)

  • Поддержка инстанцировании параметризованные Queri (полный & частично) - т. е. после создания поддержки запроса, которая дает ему часть параметров и генерирует новый запрос с замененными этими параметрами
  • Поддержка объединения двух запросов (т. добавляя условия и таблицы из одного запроса в другой)
  • комментариев Поддержки запроса (включая параметризующие их)

БОНУС (это было бы действительно сделать нас счастливыми, но мы могли бы жить без него сейчас)

  • Поддержка сериализации
  • кэширования Поддержка

Таким образом, делает Кто-нибудь знает такую ​​библиотеку?

+3

Могу ли я спросить, что дисквалифицировано [Zend_Db] (http://framework.zend.com/manual/en/zend.db.select.html)? Он имеет низкоуровневые методы, которые, по-видимому, соответствуют тому, что вы описываете: '$ select-> from (..) -> где (..) -> groupBy (..)'. Он использует PDO, который поддерживает большинство (если не все) указанных баз данных и, насколько я понимаю, является достаточно автономным. –

+0

@Mike: он не поддерживает типы данных AFAIK и поддерживает только позиционные параметры, не названные. По крайней мере, это то, что я получаю от документов и кода. Я планирую использовать его в любом случае и расширять его, чтобы поддерживать его, но я не хочу этого делать, если есть что-то, что уже есть. – StasM

+0

У меня есть библиотека, которая делает некоторые из них. например: 'Person :: name ('billy') -> join (Town :: table(), Town :: id(), SQL :: OP_EQUAL, Persion :: city_id()) -> group_by (Town :: id()) -> select (SQL :: count (Persion :: id()), Town :: all_fields()); ' – Petah

ответ

3

CodeIgniter является безопасным выбором для того, что вы ищете: http://codeigniter.com/user_guide/database/active_record.html

Кроме того, он может быть легко расширен от его ядра, чтобы делать то, что вам нужно. Он также имеет кеширование запросов (один из ваших бонусных предметов).

+0

Мне не нужен ActiveRecord, мне просто нужен генератор запросов. Мне не слишком нравятся их решения API - например, с отдельными методами 'or_where_not_in' и' or_not_like', и я не мог видеть там параметризованную поддержку запросов. Кроме того, их код использует оценки и передачи объектов по ссылке. – StasM

+2

@StasM Да, он использует evals для загрузки классов базы данных, но никогда не используется ни с какими данными запроса или с любым пользователем. Они четко отделены друг от друга ... никогда друг друга не встретится. Кроме того, если вам не нравятся некоторые из основных функций (например, 'or_where_not_in'), не используйте их. Расширьте библиотеку и напишите ее. В любом случае, удачи! – seangates