web-dev-qa-db-ja.com

db_select()を使用して2つのテーブルからフィールドを選択する

db_select()を使用していますが、fields()メソッドの構文がわかりません。別のテーブルを結合するためにjoin()を使用しています。したがって、テーブルtnの場合、次のようなことをしたい

_SELECT t.tid, t.field1, t.field2, n.title, n.author 
FROM table t INNER JOIN node n ON t.nid = n.nid;
_

私が持っています

_$results = db_select('table', 't')
  ->fields( ... )
  ->join('node', 'n', 'n.nid = t.nid')
  ->execute();
_

しかし、ご覧のとおり、私はfields()で迷っています。私が見た例では、1つのテーブルのフィールドのみを指定しています。

_->fields('t', array('tid', 'field1', 'field2'))
_

使用したい構文は何ですか?

15
user1359

簡単です。fields()を2回呼び出すだけです。

$query = db_select('table', 't');
$query->join('node', 'n', 'n.nid = t.nid');
$result = $query
  ->fields('t', array('tid', 'field1', 'field2'))
  ->fields('n', array('nid', 'field1', 'field2'))
  ->execute();

foreach ($result as $row) {
  // Do something with $row.
}

ほとんどのメソッドを複数回呼び出すことができます(複数のフィールド、複数の条件、複数の並べ替え順序、複数の結合など)。

私の例に示すように、join()の呼び出しは個別にする必要があり、「連鎖」できない(これは、複数のメソッド呼び出しを続けて行うことを表す専門用語です)ため、クエリオブジェクトは返されませんが、テーブルエイリアスの名前。

28
Berdir

特別なことをしていなければ、暗黙的な結合はdb_query()でも機能します。これが悪い習慣かどうかはわかりませんが。 IRC=で一度尋ねたところ、誰からも返事がありませんでした。そのため、D6から残っているものを持っている場合でも、それらは動作します。

2
colan