drupal 中基本的數據庫操作

Drupal 7 數據庫API增加了db_select()方法,和db_query()相比,語法更加清晰,使用也更加方便。目的也不言而喻,就是取代db_query()。下面我也就列羅出一些經常使用的技巧,可能不夠全面,還請大家多多補充。

1. 單表查詢(最基本使用方法)

<?php
$result 
db_select('contact''c')  //選擇表contact,名一個別名c
->fields('c'//查詢c表中的字段,後面不跟參數就是查詢所有
->execute()  //執行操作
->fetchAssoc(); //處理結果集
?>

2. 條件查詢(condition)

<?php
    $result 
db_select('node''n')
    ->
fields('n')
    ->
condition('nid'5,'=')  //nid等於5的條件
    
->condition('status'0,'>'// 狀態大於0,也就是爲真等於1
    
->condition('uid', array(1,5,7),'IN'//使用IN操作,當然還可以使用 NOT IN
    
->execute()
    ->
fetchAssoc();
?>

3. 聯合查詢(Join)

<?php
$query 
db_select('field_data_field_slide','f'); //主表

$query->join('node''n''fa.entity_id = n.nid'); // 聯合node表,條件是nid

$query->condition('f.field_slide_channel_tid',$chanid,'=');

$query->condition('n.status','1','=');  //發佈狀態

$query->fields('n',array('nid'));  //查詢nid

$query->orderBy('n.nid','DESC'); //排序條件

  
$query->range(0,4); //取得4條數據

   
$result $query->execute();
   
?>

4.添加字段(addField)

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

5.分頁使用(pager)

<?php
  $query 
db_select('node''n')
      ->
condition('type''article')
      ->
fields('n');
  
$query $query->extend('PagerDefault')->limit(2); //limit條件是分頁數目
  
$result $query->execute();
  foreach(
$result as $res){
     
$output .= $res->title;
   }
    
$output .= theme(‘pager’); //添加分頁theme
    
Return $output
    
?>

6.多表聯合分頁

<?php
  $query 
db_select('field_data_field_news','fa')->extend('PagerDefault'); //多表聯合查詢extend條件必須放在db_select之後

  
$query->join('node','n','fa.entity_id = n.nid');

  
$query->join('field_data_field_news_date_sort''fb''fa.entity_id = fb.entity_id');

  
$query->fields('n', array('nid','title'));

  
$query->condition('fa.field_news_classify_tid',$tids,'in'); 

  
$query->condition('n.type','news','='); 

  
$query->condition('n.status','1','=');     

$query->orderBy('fb.field_news_date_sort_value','DESC');

  
$query->limit(14);

   
$result $query->execute();
   
?>

function _module_name_autocomplete($string) {
  
$matches = array();
  
  
// Some fantasy DB table which holds cities
  
$query db_select('cities''c');
  
// Select rows that match the string
  
$return $query
    
->fields('c', array('city'))
    ->
condition('c.city''%' db_like($string) . '%''LIKE')
    ->
range(010)
    ->
execute();
  
  
// add matches to $matches  
  
foreach ($return as $row) {
    
$matches[$row->city] = check_plain($row->city);
  }
  
  
// return for JS
  
drupal_json_output($matches); //--json格式返回
}




Drupal 7 中文教程 省市縣三級聯動 實例代碼

<?php
/**
 * @file
 * 省市縣三級聯動實例代碼,
 */

/**
 * 實現鉤子hook_menu().
 */
function shengshixian_menu() {
  $items['ssx'] = array(
  'title' => '省市縣',
    'page callback' => 'shengshixian_test_page',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );

  return $items;
}

/**
 * 路徑“ssx”頁面的回調函數
 */
function shengshixian_test_page(){
 $render_array = array();
 //我們爲這個頁面設置標題
 drupal_set_title('省市縣三級聯動');
 //頁面的正文爲一個表單,注意drupal_get_form返回的不是html,需要使用drupal_render呈現一下。
 $render_array['#markup'] .= drupal_render(drupal_get_form('shengshixian_test_form'));
 //Drupal7的頁面回調,返回的應該是一個數組,只有在退化形式下,才返回字符串。
 return $render_array;
}

/**
 * 表單shengshixian_test_form的構建函數
 */
function shengshixian_test_form($form, &$form_state){
  //設置省市縣對應元素的默認值
  $default_sheng = !empty($form_state['values']['sheng']) ? $form_state['values']['sheng'] : '';
 $default_shi = !empty($form_state['values']['shi']) ? $form_state['values']['shi'] : '';
 $default_xian = !empty($form_state['values']['xian']) ? $form_state['values']['xian'] : '';
 
 //構建省份的選項數組,首先設置了一個提示語
  $sheng_options = array(
   '' => '請選擇省份',
 );
 
 //向數據庫中查詢省份信息,
 $query_sheng = db_select('taxonomy_term_data','ttd')
 ->fields('ttd', array('tid', 'name'));
 
 //因爲省份是第一級術語,分類術語的父親爲0
 $query_sheng->leftJoin('taxonomy_term_hierarchy', 'tth', 'ttd.tid = tth.tid ');
 $query_sheng->condition('tth.parent', 0);
 
 //需要確定術語所在的詞彙表,就是我們在前面創建的地區
 $query_sheng->leftJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid ');
 $query_sheng->condition('tv.machine_name', 'diqu');
 
 //按照tid排序,並執行
 $result_sheng = $query_sheng->orderBy('tid')->execute();
 
 //將返回的結果,進行迭代,爲$sheng_options賦值。
 foreach ($result_sheng as $record) {
   $sheng_options[$record->tid] = $record->name;
 }
 //省份表單元素
 $form['sheng'] = array(   
   '#title' => t('請選擇您所在的省份?'),   
   '#type' => 'select',   
   '#options' => $sheng_options,   
   '#default_value' => $default_sheng,
    //#ajax屬性數組  
   '#ajax' => array(     
     'callback' => 'shengshixian_sheng_callback',     
     'wrapper' => 'shi-wrapper-div',     
     'method' => 'replace',     
     'effect' => 'fade',   
   ), 
 );
 
 //構建市的選項數組,首先設置了一個提示語
 $shi_options = array(
   '' => '請選擇市',
 );
 //在省份不爲空的情況下,取該省份下的所有的市
 if(!empty($default_sheng)){
 
   //向數據庫中查詢術語信息,
  $query_shi = db_select('taxonomy_term_data','ttd')
  ->fields('ttd', array('tid', 'name'));
  //將其父術語限定在前面的省份的具體值上
  $query_shi->leftJoin('taxonomy_term_hierarchy', 'tth', 'ttd.tid = tth.tid ');
  $query_shi->condition('tth.parent', $default_sheng);
  //由於省份信息裏面,已經包含了詞彙表信息,所以我們不再需要關聯這個taxonomy_vocabulary表。
  //$query_sheng->leftJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid AND tv.machine_name = :machine_name', array(':machine_name' => 'diqu'));
  
  //按照tid排序,並執行
  $result_shi = $query_shi->orderBy('tid')->execute();
  
  //將返回的結果,進行迭代,爲$shi_options賦值。
  foreach ($result_shi as $record) {
   $shi_options[$record->tid] = $record->name;
  }

 }
 /*
 //測試代碼,中間測試的時候用的,這裏保留了,開發模塊所用到的測試代碼很多,多數都已刪除。
  $form['test'] = array( 
   '#markup' => '123456:'.$default_sheng
 );
 */
 //表單元素市
 $form['shi'] = array(   
   '#title' => t('請選擇您所在的市?'),   
  '#prefix' => '<div id="shi-wrapper-div">',   
  '#suffix' => '</div>',
   '#type' => 'select',   
   '#options' => $shi_options,   
   '#default_value' => $default_shi,
    '#ajax' => array(     
     'callback' => 'shengshixian_shi_callback',     
     'wrapper' => 'xian-wrapper-div',     
     'method' => 'replace',     
     'effect' => 'fade',   
   ),     
 );
 
 //構建縣的選項數組,首先設置了一個提示語
 $xian_options = array(
   '' => '請選擇縣',
 );
 //在市不爲空的情況下,取該市下的所有的縣
 if(!empty($form_state['values']['shi'])){
 
   //向數據庫中查詢術語信息,
  $query_xian = db_select('taxonomy_term_data','ttd')
  ->fields('ttd', array('tid', 'name'));
  
  //將其父術語限定在前面的市的具體值上
  $query_xian->leftJoin('taxonomy_term_hierarchy', 'tth', 'ttd.tid = tth.tid AND tth.parent = :parent', array(':parent' => $form_state['values']['shi']));
  $query_xian->condition('tth.parent', $default_shi);
  
  //由於最前面省份信息裏面,已經包含了詞彙表信息,所以我們不再需要關聯這個taxonomy_vocabulary表。
  //$query_sheng->leftJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid AND tv.machine_name = :machine_name', array(':machine_name' => 'diqu'));
  
  //按照tid排序,並執行
  $result_xian = $query_xian->orderBy('tid')->execute();
  
  //將返回的結果,進行迭代,爲$xian_options賦值。
  foreach ($result_xian as $record) {
   $xian_options[$record->tid] = $record->name;
  }
 }
 
 //表單元素縣
 $form['xian'] = array(   
   '#title' => t('請選擇您所在的縣/區?'),   
  '#prefix' => '<div id="xian-wrapper-div">',   
  '#suffix' => '</div>',
   '#type' => 'select',   
   '#options' => $xian_options,   
   '#default_value' => $default_xian,
   
 );
 
  //提交按鈕
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('提交'),
  );
  return $form;
}

/**
 * 表單元素sheng,它的值變更時,對應的Ajax回調函數。
 */
function shengshixian_sheng_callback($form,&$form_state){
  //根據當前省份,重新確定市的可選項。返回重新構建的表單元素shi
 return $form['shi'];
}

/**
 * 表單元素sheng,它的值變更時,對應的Ajax回調函數。
 */
function shengshixian_shi_callback($form,&$form_state){
  //根據當前所選的市,重新確定縣的可選項。返回重新構建的表單元素xian
 return $form['xian'];
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章