Wybierz pola z dwóch tabel za pomocą db_select ()

15

Używam db_select()i nie rozumiem składni fields()metody. Korzystam z a, join()aby dołączyć do innego stołu. Więc dla stołów ti nchcę zrobić coś takiego

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

mam

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

Ale jak widać, jestem zagubiony w fields(). Przykłady, które widziałem, określają tylko pola dla jednej tabeli:

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

Jakiej składni chcę użyć?

użytkownik1359
źródło

Odpowiedzi:

28

Łatwe, wystarczy dwukrotnie wywołać pola ().

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

Możesz wywoływać większość metod wiele razy (wiele pól, wiele warunków, wiele porządków sortowania, wiele połączeń, ...).

Zauważ, że jak pokazano w moim przykładzie, wywołanie join () musi być osobne i nie może być „powiązane” (jest to termin techniczny określający wiele wywołań metod w wierszu), ponieważ nie zwraca obiektu zapytania, ale nazwa aliasu tabeli.

Berdir
źródło
2

Łączenie niejawne będzie nadal działać z db_query (), jeśli nie robisz nic wymyślnego. Nie jestem jednak pewien, czy jest to zła praktyka, czy nie. Zapytałem raz w IRC i nie otrzymałem odpowiedzi od nikogo. Więc jeśli pozostały Ci jakieś z D6, nadal będą działać.

colan
źródło
3
Używanie db_query () jest całkowicie w porządku (jest to zalecane ze względów wydajnościowych), chyba że istnieje wyraźny powód używania db_select (). Przedstawiłem tu te powody: drupal.stackexchange.com/questions/1200/…
Berdir,
Świetny! W każdym razie byłem zbyt leniwy, by przekonwertować mój. ;)
colan