私は以下を試していますが、うまくいきます:
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を理解しようとしているので、「ビュー」を提案しないでください。現時点では。
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');
Views モジュールを使用してこれを行うことはできませんか?
ビューを作成するときは、ビュータイプリストからUser
を選択するだけです。これをプログラムで行うよりもはるかに簡単です。
更新
db_select のドキュメントによると、3番目のパラメーターは$ options配列であると想定されています。
db_select($ table、$ alias = NULL、array $ options = array())
手がかりはエラーメッセージにあります:
回復可能な致命的なエラー:db_select()に渡される引数3は、my.page.incで呼び出される配列、文字列である必要があります
コードは、文字列uid
を3番目のパラメーターとして渡します。