it-swarm.com.de

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

Ich verwende db_select() und verstehe die Syntax der Methode fields() nicht. Ich verwende eine join(), um eine andere Tabelle zu verbinden. Für die Tabellen t und n möchte ich so etwas tun

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 bei fields() verloren. Die Beispiele, die ich gesehen habe, geben nur Felder für eine Tabelle an:

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

Welche Syntax möchte ich verwenden?

15
user1359

Einfach, rufen Sie einfach Felder () zweimal auf.

$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, wie in meinem Beispiel gezeigt, der Aufruf von join () separat sein muss und nicht "verkettet" werden kann (das ist der Fachbegriff für mehrere Methodenaufrufe hintereinander), da nicht das Abfrageobjekt, sondern das zurückgegeben wird Name für den Tabellenalias.

28
Berdir

Ein impliziter Join funktioniert weiterhin mit db_query (), wenn Sie nichts Besonderes tun. Ich bin mir nicht sicher, ob dies eine schlechte Praxis ist oder nicht. Ich habe einmal in IRC gefragt und keine Antwort von irgendjemandem erhalten. Wenn Sie also noch welche von D6 übrig haben, funktionieren sie immer noch.

2
colan