Виберіть поля з двох таблиць за допомогою db_select ()


15

Я використовую db_select()і не розумію синтаксис fields()методу. Я використовую a, join()щоб приєднатися до іншої таблиці. Тому для столів tі n, я хочу зробити щось подібне

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'))

Що таке синтаксис, який я хочу використовувати?

Відповіді:


28

Легко, просто викликуйте поля () двічі.

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

Більшість методів можна викликати кілька разів (декілька полів, кілька умов, кілька замовлень сортування, кілька приєднань, ...).

Зауважте, що, як показано в моєму прикладі, заклик приєднатись до () повинен бути окремим і не може бути "прикованим" (це технічний термін для кількох викликів методів підряд), оскільки він не повертає об'єкт запиту, а Псевдонім таблиці.


2

Неявне приєднання все одно працюватиме з db_query (), якщо ви нічого не фантазуєте. Я не впевнений, чи це погана практика чи ні. Я запитав одного разу в IRC і не отримав відповіді ні від кого. Тож якщо у вас є хтось із тих, що залишилися від D6, вони все одно працюватимуть.


3
Використання db_query () ідеально (це фактично рекомендується з міркувань продуктивності), якщо немає явної причини використання db_select (). Я виклав ці причини тут: drupal.stackexchange.com/questions/1200/…
Бердір

Чудово! Я був лінивий, щоб перетворити шахту все одно. ;)
колан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.