0

Drupal 7 データベース API を使用してテーブルを検索しています。ページングとソートのエクステンダーも使用しています。問題は、ページネーションのためにクエリが制限を使用しているときに見つかったレコードの総数を表示するにはどうすればよいですか? すべての条件を含むクエリを 2 回実行する必要がありますか? カウントを取得するために1回、制限付きでもう1回?それは非効率なようです。参照用の私のコードは次のとおりです。私はデータベース API を初めて使用するので、何か間違ったことをしている場合は、自由にコードを調整するか、正しい方向に向けてください。また、これはまだ完了しておらず、条件は 1 つしかありませんが、最終的には 3 つになります。

function job_search() {
  // Initialising output
  $output = 'SOME STUFF';

  // Table header
  $header = array(
    array('data' => 'Description'),
    array('data' => 'Location', 'field' => 'job_location_display'),
    array('data' => 'Specialty', 'field' => 'specialty_description'),
    array('data' => 'Job Type', 'field' => 'job_board_type'),
    array('data' => 'Job Number', 'field' => 'job_number'),
  );

  // Setting the sort conditions
  if(isset($_GET['sort']) && isset($_GET['order'])) {
    // Sort it Ascending or Descending?
    if($_GET['sort'] == 'asc')
      $sort = 'ASC';
    else
      $sort = 'DESC';

    // Which column will be sorted
    switch($_GET['order']) {
      case 'Location':
        $order = 'job_location_display';
        break;
      case 'Specialty':
        $order = 'specialty_description';
        break;
      case 'Job Number':
        $order = 'job_number';
        break;
      case 'Job Type':
        $order = 'job_board_type';
        break;
      default:
        $order = 'job_number';
    }
  }
  else {
    $sort = 'ASC';
    $order = 'job_number';
  }

  // Query object
  $query = db_select("jobs", "j");  

  // Adding fields
  $query->fields('j');

  if(isset($_GET['location'])) {
    $query->condition('j.job_state_code', $_GET['location'], '='); 
  }

  // Set order by
  $query->orderBy($order, $sort);  

  // Pagination
  $query = $query->extend('TableSort')->extend('PagerDefault')->limit(20);

  // Executing query
  $result = $query->execute();

  // Looping for filling the table rows
  while($data = $result->fetchObject()) {
    $description = '<div class="thumbnail"><img src="/sites/all/themes/zen/vista_assets/images/job_headers/' . $data->job_image_file . '"/></div>';
    $description .= '<div class="title">' . $data->job_board_subtitle . '</div>';
    // Adding the rows
    $rows[] = array($description, $data->job_location_display, $data->specialty_description, $data->job_board_type, $data->job_number);    
  }

  $output .= theme('pager');

  // Setting the output of the field
  $output .= theme_table(
    array(
      'header' => $header,
      'rows' => $rows,
      'attributes' => array('id' => array('job-listing')),
      'sticky' => true,
      'caption' => '',
      'colgroups' => array(),
      'empty' => t("No records found.")
    )
  ).theme('pager');

  // Returning the output
  return $output;
}

これはうまくいきました:

//get total records
$num_rows = $query->countQuery()->execute()->fetchField(); 

// add paging and sorting
$query = $query->extend('TableSort')->extend('PagerDefault')->limit(20);

//execute again
$result = $query->execute();
4

1 に答える 1

0

ドキュメントによると: https://api.drupal.org/api/drupal/includes!database!database.inc/function/db_query/7

行の総数を取得するには、関数を使用することをお勧めします。これは、クエリ行の総数を返すdb_query()メソッドがあるためです。rowCount()

<?php
// Using the same query from above...
$uid = 1;
$result = db_query('SELECT n.nid, n.title, n.created
FROM {node} n WHERE n.uid = :uid', array(':uid' => $uid));

// Fetch next row as a stdClass object.
$record = $result->fetchObject(); 

// Fetch next row as an associative array.
$record = $result->fetchAssoc();

// Fetch data from specific column from next row
// Defaults to first column if not specified as argument
$data = $result->fetchColumn(1); // Grabs the title from the next row

// Retrieve all records into an indexed array of stdClass objects.
$result->fetchAll();

// Retrieve all records as stdObjects into an associative array
// keyed by the field in the result specified.
// (in this example, the title of the node)
$result->fetchAllAssoc('title');

// Retrieve a 2-column result set as an associative array of field 1 => field 2.
$result->fetchAllKeyed();
// Also good to note that you can specify which two fields to use
// by specifying the column numbers for each field
$result->fetchAllKeyed(0,2); // would be nid => created
$result->fetchAllKeyed(1,0); // would be title => nid

// Retrieve a 1-column result set as one single array.
$result->fetchCol();
// Column number can be specified otherwise defaults to first column
$result->fetchCol($db_column_number);

// Count the number of rows
$result->rowCount();
?>
于 2013-10-22T19:46:33.537 に答える