Database API

Главные вкладки

Аватар пользователя Zerbert Zerbert 14 декабря 2016 в 13:46

Доброго времени суток, уважаемые коллеги!

У меня не получается составить правильный запрос к базе данных.
Есть тип материала и 2 связанных с ним словаря таксономии. Используя Database API хотелось бы получить эти значения.
Суть проблемы: получить данные водном запросе.

Я могу получить данные 2-мя запросами, по одному на каждый словарь, а вот получить эти данные одним запросом не получается.

Первый запрос:

<?php
        $nid 
$_GET['nid'];
        
$query db_select('node''n');
        
$query->innerJoin('field_data_field_region''r''n.nid = r.entity_id');
        
$query->innerJoin('taxonomy_term_data''tr''tr.tid = r.field_region_tid');
        
$query->fields('tr', array('name'));
        
$query->condition('n.nid'$nid);
        
$query->condition('n.status'1);
        
$uch $query->execute()->fetchAll();
        
print_r($uch);
?>

Второй запрос:

<?php
        $nid 
$_GET['nid'];
        
$query db_select('node''n');
        
$query->innerJoin('field_data_field_vid_ispolzovaniya''v''n.nid = v.entity_id');
        
$query->innerJoin('taxonomy_term_data''tr''tr.tid = v.field_vid_ispolzovaniya_tid');
        
$query->fields('tr', array('name'));
        
$query->condition('n.nid'$nid);
        
$query->condition('n.status'1);
        
$uch $query->execute()->fetchAll();
        
print_r($uch);
?>

Помогите объединить эти запросы в один

Комментарии

Аватар пользователя Zerbert Zerbert 14 декабря 2016 в 17:52

В том то и дело, что я не понимаю логики запроса. Мне нужно из одной таблицы taxonomy_term_data 2 раза достать одно поле name, причём так, чтобы первое значение соответствовало первому словарю, а второе - соответственно второму. Я не совсем понимаю, как такой запрос составить на SQL, а раз не понимаю этого, то не могу его перевести в database API.

Аватар пользователя fairrandir fairrandir 14 декабря 2016 в 18:16
SELECT DISTINCT n.nid, tr.tid AS term1, tr2.tid AS term2
FROM node AS n
INNER JOIN field_data_field_tags AS nr1 ON n.nid = nr1.entity_id
INNER JOIN taxonomy_term_data AS tr ON tr.tid = nr1.field_tags_tid
INNER JOIN field_data_field_article_category AS nr2 ON nr2.entity_id = n.nid
INNER JOIN taxonomy_term_data AS tr2 ON tr2.tid = nr2.field_article_category_tid
ORDER BY n.nid ASC

Как вариант. В SQL не сильно шарю, но зачем innerJoin? Дубли же будут.

Аватар пользователя sas@drupal.org sas@drupal.org 15 декабря 2016 в 8:28

через taxonomy_index будет быстрее работать, а принцип:

$query = db_select('node', ' n')
->fields('n')
->addTag('content accees');
$query->innerJoin('taxonomy_index', 'ti', "ti.nid = n.nid")
$query->innerJoin('taxonomy_term_data' , 'ttd', 'ttd.tid = ti.tid');
$query->condition('ttd.vid', $my_vids, 'IN');
$res = $query->execute()->fetchAll();
...

Аватар пользователя Zerbert Zerbert 15 декабря 2016 в 14:14

К сожалению, так и не получилось решить вопрос. Даже используя только ваш кусок кода и вместо $my_vids подставив array(3, 4) - id моих словарей, получаю ничего. Пустоту.