web-dev-qa-db-ja.com

SQLテーブルをページ分割されたリストとして表示する

私は以下を試していますが、うまくいきます:

my.module:

   function my_menu() {
      $items['page_example'] = array(
        'title' => 'Page Example',
        'description' => 'Page Example',
        'page callback' => 'page_example',
        'access callback' => TRUE,
        'file' => 'my.page.inc',
        'file path' => drupal_get_path('module', 'my'),
        'type' => MENU_CALLBACK,
      );
     return $items;
   }

my.page.inc:

function page_example() {
  return array(
    'page_example' => array(
      '#type' => 'markup',
      '#markup' => generate_list(),
    ),
  );
}

function generate_list() {
  $query = db_select('users', 'name')
    ->extend('PagerDefault')
    ->fields('name', array('Name'))
    ->orderBy('created', 'DESC')
    ->limit(20);

  $result = $query->execute();
  $output = '';
  foreach ($result as $row) {
    $output .= $row->name.'<br/>';
  }

  $output .= theme('pager');
  return $output;
}

しかし、私はid-fieldを各行の先頭に追加しようとすると失敗します:

  $query = db_select('users', 'name', 'uid')
    ->extend('PagerDefault')
    ->fields('name', array('Name'), 'uid', array('Id'))
    //->addField('uid', 'User Id')
    //->addField('name', 'User Name')
    ->orderBy('created', 'DESC')
    ->limit(20);

  $result = $query->execute();
  $output = '';
  foreach ($result as $row) {
    $output .= $row->uid.': '.$row->name.'<br/>';
  }

エラーで:

Recoverable fatal error: Argument 3 passed to db_select() 
must be an array, string given, called in my.page.inc 
on line 13 and defined in function db_select() 
(line 2387 in includes/database/database.inc).

更新:

Camsoftのコメント(ありがとう)について、コードを次のように変更しました。

  $query = db_select('users')
    ->extend('PagerDefault')
    ->fields('name', array('Name'), 'uid', array('Id'))
    //->addField('uid', 'User Id')
    //->addField('name', 'User Name')
    ->orderBy('created', 'DESC')
    ->limit(20);

そして今それは失敗します

DOException: SQLSTATE[42P01]: Undefined table: 7 ERROR: 
missing FROM-clause entry for table "name" at character 8: 
SELECT name.Name AS Name, created AS created FROM {users} 
users ORDER BY created DESC LIMIT 20 OFFSET 0; Array ( ) 
in function PagerDefault->execute() (line 80 includes/pager.inc).

私はただ理解しようとしているだけですページングされたdb_selectに2番目のSQLテーブルフィールドを追加する方法 ... DBTNGを理解しようとしているので、「ビュー」を提案しないでください。現時点では。

3

db_select()の呼び出しと、それに続くメソッドの呼び出しは正しくありません。

  • db_select()の2番目のパラメーターはテーブルエイリアスであり、クエリで使用されるフィールドを参照するときに使用する必要があります。
  • fields()に渡されたパラメーターが間違っています。 db_select()の呼び出し方法の例については、次のスニペットを参照してください。
 $ result = db_select( 'file_usage'、 'f')
-> fields( 'f'、array( 'module'、 'type'、 'id'、 'count')) 
-> condition( 'fid'、$ file-> fid)
-> condition( 'count'、0、 '>')
-> execute(); 

db_select()の呼び出しは、次のように書き直す必要があります。

$query = db_select('users', 'u')
  ->fields('u', array('name', 'uid'))
  ->orderBy('created', 'DESC')
  ->limit(20)
  ->extend('PagerDefault');
5
kiamlaluno

Views モジュールを使用してこれを行うことはできませんか?

ビューを作成するときは、ビュータイプリストからUserを選択するだけです。これをプログラムで行うよりもはるかに簡単です。

更新


db_select のドキュメントによると、3番目のパラメーターは$ options配列であると想定されています。

db_select($ table、$ alias = NULL、array $ options = array())

手がかりはエラーメッセージにあります:

回復可能な致命的なエラー:db_select()に渡される引数3は、my.page.incで呼び出される配列、文字列である必要があります

コードは、文字列uidを3番目のパラメーターとして渡します。

2
Camsoft