web-dev-qa-db-ja.com

直接データベースクエリを作成する

基本的に、現在のデータベースに対してこのクエリを実行し、foo_typeのノードタイプを持つすべてのノードタイトルを取得します。

SELECT title FROM node WHERE type='foo_type' ORDER BY title ASC

Db_queryまたは同様の関数を使用してこれを行うにはどうすればよいですか?以下を試してみましたが、$ resultが空です。

$result = db_query("SELECT title FROM node WHERE type='foo_type' ORDER BY title ASC");

D6とD7に違いがある場合は注意してください。

2
joejam

Drupal 6の場合:

$result = db_query("SELECT title FROM node WHERE type = '%s' ORDER BY title ASC", 'foo_type');
$titles = array();
while ($row = db_fetch_object($result)) {
  $titles[] = $row->title;
}

Drupal 7の場合、たくさんのオプションがあります

静的:

$args = array(':type' => 'foo_type');
$titles = db_query("SELECT title FROM node WHERE type = :type ORDER BY title ASC", $args)->fetchCol();

動的:

$titles = db_select('node')
  ->fields('node', array('title'))
  ->condition('type', 'foo_type')
  ->orderBy('title')
  ->execute()
  ->fetchCol();

そして、いくつかのあまり直接的でない方法...

EntityFieldQuery:

$query = new \EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
  ->entityCondition('type', 'foo_type')
  ->propertyOrderBy('title');

$results = $query->execute();
if (!empty($results['node'])) {
  $nodes = node_load_multiple(array_keys($results['node']));
  $titles = array_map(function($x) { return $x->title; }, $nodes);
}

API(非推奨):

$nodes = entity_load('node', FALSE, array('type' => 'foo_type'));
$titles = array_map(function($x) { return $x->title; }, $nodes);  
9
Clive