Как правильно делать JOIN для таблиц с CCK полями

Если вам захочется сделать выборку нод вместе с CCK полями, то первым желанием будет посмотреть схему таблиц и набросать что-нибудь в духе:

SELECT n.title, f.field_name_value FROM {node} n
INNER JOIN {content_type_story} f ON n.nid = f.nid AND n.vid = f.vid
WHERE n.type = 'story'
ORDER BY n.title

(в примере выбираются заголовки нод типа story и соответствующее им значение cck поля field_name)

Однако тут есть подводный камень — если поле используется только в одном типе материалов и может иметь только одно значение, то оно хранится в таблице с именем content_type_TYPE (где TYPE это тип материала), иначе же значения хранятся в таблице content_FIELD_NAME (где FIELD_NAME это название поля). Это значит, что как только мы добавим поле field_name в другой материал, или дадим ему возможность иметь несколько значений, запрос перестанет работать.

Поэтому правильней будет — сначала с помощью CCK API узнать название таблицы, и только потом джойнить её в SQL запросе:

$field = content_fields('field_name');
$db_info = content_database_info($field);
 
$result = db_query("
  SELECT title, %s FROM {node} n
  INNER JOIN {%s} f ON n.nid = f.nid AND n.vid = f.vid
  WHERE n.type = 'story'
  ORDER BY n.title
", $db_info['columns']['value']['column'], $db_info['table']);

Написанное актуально для
CCK 6.x-2.x
Теги:
работа с бд, cck
Добавлено: 27 Июля 2018 08:14:12 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...