Выберите поля из двух таблиц, используя db_select ()


15

Я использую, db_select()и я не понимаю синтаксис fields()метода. Я использую, 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

Легко, просто вызовите 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_query () прекрасно (это действительно рекомендуется из соображений производительности), если только нет явной причины для использования db_select (). Я изложил эти причины здесь: drupal.stackexchange.com/questions/1200/…
Бердир

Большой! В любом случае, я был слишком ленив, чтобы преобразовать свое. ;)
колан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.