Конструктор запросов, как API базы данных Drupal? - PullRequest
1 голос
/ 14 декабря 2011

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

Когда я занимался разработкой для Drupal, мне пришлось использовать API базы данных. Большую часть времени это было действительно приятно, позволяя создавать запросы и заставлять их избегать всего за вас. Подготовленные PDO и mysqli заявления не приближаются к изяществу и чистоте API Drupal Database. И я до сих пор не могу понять, как, например, использовать подготовленный оператор в mysqli для вставки строк неизвестного размера, не создавая запрос самостоятельно, не нанося ущерба цели подготовленных операторов. Это просто мешает мне

Пример из актуального кода Drupal API

$query = db_select('tcsync_queue', 'q')
    ->condition('q.id', $post["tcsync_lastrecord"], '>')
    ->fields('q', array('id', 'uid', 'type', 'name', 'data'))
    ->execute();

foreach ($query as $item) {
    $updateitem = array(
        "id" => $item->id, 
        "uid" => $item->uid, 
        "type" => $item->type, 
        "name" => strtoupper($item->name),
        "data" => $item->data);
    ....
}

Есть ли конструктор запросов, который немного приблизился к компоновщику запросов в Drupal?

Ответы [ 4 ]

1 голос
/ 26 декабря 2011

Возможно, вы ищете NotORM Домашняя страница PHP-библиотека.Он достаточно легкий (я думаю, это то, о чем вы просите) и является автономным компонентом, поэтому вам не приходится тратить много времени на интеграцию.

Он работает с PDO в качестве объекта соединения:

include "NotORM.php";
$pdo = new PDO("mysql:dbname=software");
$db = new NotORM($pdo);

, поэтому он поддерживает любую базу данных, доступную в PDO.

Затем можно просто выполнять запросы, это пример для базы данных с таблицей приложений:

foreach ($db->application() as $application) { // get all applications
    echo "$application[title]\n"; // print application title
}

Когда дело доходит до места и ограничений, оно работает так:

$applications = $db->application()
    ->select("id, title")
    ->where("web LIKE ?", "http://%")
    ->order("title")
    ->limit(10)
;
foreach ($applications as $id => $application) {
    echo "$application[title]\n";
}

Хорошо работает, что не так с похожим кодом, например, с кодом SQL в codeigniter.

1 голос
/ 23 декабря 2011

CodeIgniter делает это очень хорошо:

, например

Выберите:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
$query = $this->db->get();

Вставка:

$this->db->set('title',$title)->insert('mytable');

Обновление:

$this->db->where('id', $id)->set('title',$title)->update('mytable');

См .: http://codeigniter.com/user_guide/database/active_record.html

1 голос
/ 22 декабря 2011

Я думаю, что вы хотели бы DBAL Доктрины 2. Я скину немного кода для вас:

    $locationIds = array(1,2,3,4,5,6,7);

    $locationTreeDepthQb = $conn->createQueryBuilder();
    $locationTreeDepthQb->select("COUNT(*) as count")
        ->from('location_tree_data', 'd')
        ->where("d.tree_depth >= 2")
        ->andWhere("d.tree_id IN (?)");
    $stmt = $conn->executeQuery($locationTreeDepthQb->getSQL(), array($locationIds), array(Connection::PARAM_INT_ARRAY));
    $res = $stmt->fetch();

Обратите внимание, насколько просто передать массив для оператора SQL "IN" в этом конструкторе запросов.

Документацию можно найти здесь: http://www.doctrine -project.org / документы / DBAL / 2,2 / ен /

0 голосов
/ 23 декабря 2011

https://github.com/kenaniah/insight/blob/master/classes/query.php может быть изменен, чтобы стоять самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...