使用db_select()从两个表中选择字段


15

我正在使用db_select(),但不了解该fields()方法的语法。我正在使用A 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()。我看到的示例仅指定一个表的字段:

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

我要使用什么语法?

Answers:


28

容易,只需两次调用fields()。

$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()的调用需要分开,并且不能“链接”(这是连续有多个方法调用的技术术语),因为它不会返回查询对象,但是表别名的名称。


2

如果您不做任何花哨的工作,则隐式联接仍将与db_query()一起使用。我不确定这是否是错误的做法。我在IRC中问过一次,但没有得到任何人的回应。因此,如果您有D6遗留下来的任何内容,它们仍然可以使用。


3
除非有明确的理由使用db_select(),否则使用db_query()非常好(出于性能原因,实际上建议这样做)。:我在这里列出这些理由drupal.stackexchange.com/questions/1200/...
Berdir

大!无论如何我都懒得zy依。;)
colan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.