Wählen Sie mit db_select () Felder aus zwei Tabellen aus

15

Ich benutze db_select()und ich verstehe die Syntax der fields()Methode nicht. Ich benutze a join(), um mich einem anderen Tisch anzuschließen. Also für Tische tund nmöchte ich sowas machen

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

ich habe

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

Aber wie Sie sehen können, bin ich verloren fields(). In den Beispielen, die ich gesehen habe, werden nur Felder für eine Tabelle angegeben:

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

Welche Syntax möchte ich verwenden?

user1359
quelle

Antworten:

28

Einfach Felder () zweimal aufrufen.

$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.
}

Sie können die meisten Methoden mehrmals aufrufen (mehrere Felder, mehrere Bedingungen, mehrere Sortierreihenfolgen, mehrere Verknüpfungen, ...).

Beachten Sie, dass der Aufruf von join (), wie in meinem Beispiel gezeigt, separat sein muss und nicht "verkettet" werden kann (das ist der Fachbegriff für mehrere Methodenaufrufe in einer Zeile), da er nicht das Abfrageobjekt, sondern das zurückgibt Name für den Tabellenalias.

Berdir
quelle
2

Ein impliziter Join funktioniert immer noch mit db_query (), wenn Sie nichts Besonderes tun. Ich bin mir nicht sicher, ob dies eine schlechte Übung ist oder nicht. Ich habe einmal im IRC gefragt und von niemandem eine Antwort erhalten. Also, wenn Sie noch welche von D6 haben, funktionieren sie immer noch.

colan
quelle
3
Die Verwendung von db_query () ist völlig in Ordnung (dies wird aus Gründen der Leistung empfohlen), es sei denn, es gibt einen ausdrücklichen Grund für die Verwendung von db_select (). Ich habe diese Gründe hier umrissen: drupal.stackexchange.com/questions/1200/…
Berdir
Groß! Ich war sowieso zu faul, um meine zu konvertieren. ;)
Colan