像Drupal的Database API这样的查询构建器?

时间:2011-12-13 22:19:17

标签: php drupal

我正在寻找纯粹的mysql和mysqli的分支,并尝试使用更好的数据库访问,而不是DAO层(这里增加了太多的复杂性)。

当我做一些Drupal开发时,我不得不使用它的数据库API。大部分时间都非常好,允许您构建查询并让它为您逃避一切。 PDO和mysqli准备好的语句并没有接近Drupal Database API的优点和清晰度。而且我仍然无法弄清楚如何使用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 个答案:

答案 0 :(得分:1)

我认为你喜欢Doctrine 2的DBAL。 我会为你扔一些saple代码:

    $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();

请注意在此查询构建器中为“IN”SQL语句传递数组是多么容易。

可在此处找到文档: http://www.doctrine-project.org/docs/dbal/2.2/en/

答案 1 :(得分:1)

CodeIgniter做得非常好:

e.g。

选择

$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

答案 2 :(得分:1)

您可能正在寻找NotORM­Homepage 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";
}

它做得很好,与类似的代码不同,例如codeigniter中的sql代码。

答案 3 :(得分:0)