Drupal 7 常用SQL操作语句

论坛: 

查询:
db_query('SELECT * FROM {joke} WHERE vid = :vid', array(':vid' => $node->vid));
-------

插入:
$nid = db_insert('joke')
  ->fields(array(
    'nid' => '4',
    'vid' => 1,
    'punchline' => 'And the pig said oink!',
  ))
  ->execute();
--------

更新:
$num_updated = db_update('joke')
  ->fields(array(
    'punchline' => 'Take my wife please!',
  ))
  ->condition('nid', 3, '>=')
->execute();
// 如果我想知道有多少条记录被更新了,可以通过 $num_updated 获得。
--------

删除:
$num_deleted = db_delete('joke')
->condition('punchline', 'Take my wife please!')
->execute();

——————————————————————————————
Drupal 7 中从数据库中获取值:
——————————————————————————————

获取单行:
// 获取 joke 表的总记录条数
$nbr_records = db_query("SELECT count(nid) FROM {joke}")->fetchField();

--------
获取多行:

// 获取 node 表中类型=page && 状态=1 的所有记录的标题
$type = 'page';
$status = 1;

$result = db_query("SELECT nid, title FROM {node} WHERE type = :type AND status = :status",
array(
  ':type' => $type, ':status' => 1,
));

foreach ($result as $row) {  
   echo $row->title."<br/>";
}

——————————————————————————————
使用查询生成器和查询对象构造复杂的查询:
——————————————————————————————
$result = db_query('SELECT name FROM {role} WHERE rid = :rid', array(':rid' => 2));
使用查询生成器和查询对象来改造上面语句,实现相同的功能:
// ->range 可以用来限制显示的条数。
// 用法:->range(0, 100);
$query = db_select('role', 'r'); // 选择 role 表,并给一个别名 'r'
$query                           // 显示 rid=2 的 name 字段
->condition('rid', 2)
->fields('r', array('name'));  
$result = $query->excute();      // 执行语句,将结果存入数组 $result
foreach($result as $row) {       // 循环打印出结果
    echo $row->name."<br/>";
}

——————————————————————————————
分页
——————————————————————————————
$query = db_select('node', 'n')->extend('PagerDefault'); // 选择表 并使用分页
$query                                                  // 显示类型为page的title字段
  ->condition('type', 'page')
  ->fields('n', array('title'))
  ->limit(10);                                           // 每页显示10条
$output = '';                                          
foreach ($result as $row) {  
   $output .= $row->title."<br/>";
}
$output .= theme('pager');                               // 设置分页样式
print $output;                                           // 输出
——————————————————————————————
end

Drupal 7 db_select 联合表查询

Drupal 7 发生了很大的改变,包括数据结构和一下api,总之感觉上更加强大,开发更加方便,提供了更多扩展性很强的api使用。drupal 7 数据层比较drupal 6 而已发生了很大的改变。drupal 7 多表查询使用实例:

<?php

/**
* 只要读取一个词汇表里面的没有父类的ID,也就是最高级别的分类
*/
function ditusearch_top_parent_id($vid) {
    $query = db_select('taxonomy_term_hierarchy','h'); //选择表
    $query->join('taxonomy_term_data','d','h.tid = d.tid'); // 联合查询
    $query->addField('d', 'tid'); // 添加字段
    $query->condition('h.parent',0); // 添加条件where
    $query->condition('d.vid',$vid); // 再添加一个条件 and ....
    $query->addTag('ditusearch_generate_path'); // 添加Tag
可选项,这个就是方便其他地方可以改变这个查询$query 比如如果添加了tag 可以使用 hook_query_alter 对其进行查询
如果你使用过views开发,views 也可以了类似的hook
    $tid = $query->execute()->fetchCol();
    return $tid; //返回一个数组
}

/**
* hook_query_alter使用, 对上面的 $query 改变
*/
function ditusearch_query_alter(QueryAlterableInterface $query) {
    if($query->hasTag('ditusearch_generate_path')) {
        $query->addField('d','vid'); // 通过下图可以感到对查询进行了改变
    }
}
?>