Програмная выборка множества нод за раз

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

Аватар пользователя evolved evolved 21 июня 2011 в 16:47

Доброе время суток, уважаемые друпалеры.
При написании модуля возник затык, нужно выбрать множество нод с CCK полями и таксономией (т.е. то что делает функция node_load()) в какой либо массив для дальнейших операций с данными.
Я думаю, что вариант

<?php
foreach($node_ids as $nid){
  
$data[] = node_load($nid);
  ...
}
?>

не подходит, т.к. происходит большое количество запросов в базу из-за выборки каждой ноды функцией node_load(). Можно ли каким-либо выбрать все нужные ноды разом? Спасибо заранее.

Комментарии

Аватар пользователя xxandeadxx xxandeadxx 21 июня 2011 в 16:57

"evolved" wrote:
т.к. происходит большое количество запросов в базу из-за выборки каждой ноды функцией node_load()

позвольте поинтересоваться, сколько же у вас нод в базе?

Аватар пользователя divined divined 21 июня 2011 в 17:02

Может вы зададите более точный вопрос, и вам подскажут решение вашей глобальной проблемы?

Например для меня достаточно хранить массив $nid-ов и остальные данные вытягивать или своим запросом, или передавать этот массив модулю Views для рендеринга.

Аватар пользователя evolved evolved 21 июня 2011 в 17:17

Есть множество нод с CCK полями и связями с различными терминами таксономии (фирмы, группы товаров, подгруппы товаров, товары). Возникла необходимость собирать статистику посещения пользователями тех или иных фирм или товаров за определенный промежуток времени с последующей выгрузкой в CSV файл. Для этого пишу модуль, который выбирает статистику из таблицы accesslog, парсю по полю path и собираю идентификаторы нод товаров или фирм. Для экспорта мне необходимы все связанные с нодами данные из CCK полей и терминов таксономи. Можно использовать функцию node_load() в цикле, подсовывая ей $nid, но большое количество запросов в базу на каждую ноду не есть гуд, по этому встал вопрос, можно ли как-нибудь выбрать все нужные ноды с данными за раз, а уже потом крутить массив с данными и делать дальнейшую обработку?

Аватар пользователя divined divined 21 июня 2011 в 17:52

«но большое количество запросов в базу на каждую ноду не есть гуд» -
не верьте всему что тут пишут, а возьмите и проверьте, для меня node_load ни чем не хуже чем убийственные запросы генерируемые модулем Views.

А вообще, если просто, то создайте view с теми полями которые хотели бы видеть, добавьте аргумент "node->nid" и возможность множественных аргументов

А у себя в коде напишите:

<?php
$data 
='';
foreach(
$node_ids as $nid){
  
$data. = $nid+',';
}

print 

views_embed_view('view_name''page_name'substr($data0strlen($data)-1););
?>
Аватар пользователя Xermit Xermit 21 июня 2011 в 21:55

а чем view с http://drupal.org/project/views_bulk_operations
не подошло для решения задачи? А если такую view встроить как cck поле в материал и в материал же добавить еще cck полей для параметризации самих php операций.