drupal动态查询

论坛: 

在执行性能耗损大,或者语法结构复杂的查询的使用我们应该使用drupal动态查询。
drupal的动态查询由db_select()函数完成。形式如下:

<?php
$query = db_select('users', 'u', $options);
?>

db_select接受三个参数,一次是:数据库名,数据库别名(随意),数据库连接设置,其中数据库名是不需要带数据库前缀的,drupal会自动为我们加上。至于数据库连接设置,我们在静态查询中已经讲过。
我们通过静态查询来理解动态查询:

<?php
$result = db_query("SELECT uid, name, status, created, access FROM {users} u WHERE uid <> 0 LIMIT 50 OFFSET 0");
?>

上面的查询语句从drupal user表中查询uid不等于0的50行,并返回结果的uid, name, status, created, access列的结果,上面的静态查询等同于下面的动态查询。

<?php
// Create an object of type SelectQuery
$query = db_select('users', 'u');

// Add extra detail to this query object: a condition, fields and a range
$query
->condition('u.uid', 0, '<>')
->fields('u', array('uid', 'name', 'status', 'created', 'access'))
->range(0, 50);
?>

加由此可以看出,db_select()函数通过condition方法(类方法)控制查询,等同于sql语句中的where,使用fields()来添加返回的字段(列),通过range来控制返回结果的数目。
而fields()函数接受两个参数,第一个为在db_select()中设置的本次数据库表别名,第二个为要返回的列。
而condition()接受两个参数,第一个为要控制查询的键名,之,和sql比较运算符。
至于为什么要使用别名,我们会在后面讲到。
最后我们通过:

<?php
$result = $query->execute();
?>

我们也可以执行多个数据库表的联合查询:

<?php
// 这个不用讲解吧。。.
$query = db_select('node', 'n');
// 三个参数,前两个不用说,第三个为关联查询的条件,不了解sql join语句的百度,不解释.
$query->join('users', 'u', 'n.uid = u.uid');
// 增加返回结果的字段.
$query->addField('n','nid');
$query->addField('u','name');
// 执行查询。.
$query->condition('type', 'page');
?>

来执行上面的查询语句,否则查询将不会被执行。
我们可以通过下面的语句来调试查询语句。

<?php
print_r($query->__toString());
?>