Доброе время суток, уважаемые друпалеры.
При написании модуля возник затык, нужно выбрать множество нод с CCK полями и таксономией (т.е. то что делает функция node_load()) в какой либо массив для дальнейших операций с данными.
Я думаю, что вариант
<?php
foreach($node_ids as $nid){
$data[] = node_load($nid);
...
}
?>
не подходит, т.к. происходит большое количество запросов в базу из-за выборки каждой ноды функцией node_load(). Можно ли каким-либо выбрать все нужные ноды разом? Спасибо заранее.
Комментарии
Нет, это тебе не семёрка.
Строчи свой запрос в обход node_load()
позвольте поинтересоваться, сколько же у вас нод в базе?
около 30000
<?php
$data = array();
foreach($node_ids as $nid){
$data[]. = node_load($nid);
}
?>
1500 нод обрабатывает меньше 100мс.
Может вы зададите более точный вопрос, и вам подскажут решение вашей глобальной проблемы?
Например для меня достаточно хранить массив $nid-ов и остальные данные вытягивать или своим запросом, или передавать этот массив модулю Views для рендеринга.
Есть множество нод с CCK полями и связями с различными терминами таксономии (фирмы, группы товаров, подгруппы товаров, товары). Возникла необходимость собирать статистику посещения пользователями тех или иных фирм или товаров за определенный промежуток времени с последующей выгрузкой в CSV файл. Для этого пишу модуль, который выбирает статистику из таблицы accesslog, парсю по полю path и собираю идентификаторы нод товаров или фирм. Для экспорта мне необходимы все связанные с нодами данные из CCK полей и терминов таксономи. Можно использовать функцию node_load() в цикле, подсовывая ей $nid, но большое количество запросов в базу на каждую ноду не есть гуд, по этому встал вопрос, можно ли как-нибудь выбрать все нужные ноды с данными за раз, а уже потом крутить массив с данными и делать дальнейшую обработку?
«но большое количество запросов в базу на каждую ноду не есть гуд» -
не верьте всему что тут пишут, а возьмите и проверьте, для меня node_load ни чем не хуже чем убийственные запросы генерируемые модулем Views.
А вообще, если просто, то создайте view с теми полями которые хотели бы видеть, добавьте аргумент "node->nid" и возможность множественных аргументов
А у себя в коде напишите:
<?php
$data ='';
foreach($node_ids as $nid){
$data. = $nid+',';
}
print
views_embed_view('view_name', 'page_name', substr($data, 0, strlen($data)-1););?>
а чем view с http://drupal.org/project/views_bulk_operations
не подошло для решения задачи? А если такую view встроить как cck поле в материал и в материал же добавить еще cck полей для параметризации самих php операций.