XPDO ресурсы и связанные TV в одном объекте
Пытаюсь сделать выборку на xPDO сложнее чем в примерах для обучения. Сформировать объект при помощи xPDO содержащий все поля ресурса + его TV и записать в XML.
Есть ресурсы, выбираем те, у которых parent равен определенному id. при этом в объект надо прикрепить все TV поля этого ресурса. пробуем достать граф. modResource — для полей ресурса, TemplatevarResources — связь для получения many TVшек, и TemplateVar связь для получения имени TV.
Ставим лимит 100, в
При доступе к связанным объектам графа вообще в переменных код сниппетов вижу.
Что не так с getCollectionGraph в моем случае?
p.s. для чего это надо? При вызове $resource-getTVValue(x) для каждого ТВ, Мы обращаемся к БД. И если у нас 700 ресурсов по 50 tv параметров, то получаем 35000 отдельных запросов.
Есть ресурсы, выбираем те, у которых parent равен определенному id. при этом в объект надо прикрепить все TV поля этого ресурса. пробуем достать граф. modResource — для полей ресурса, TemplatevarResources — связь для получения many TVшек, и TemplateVar связь для получения имени TV.
$c = $modx->newQuery('modResource');
$c->where(array(
'parent' => '30'
));
$resources = $modx->getCollectionGraph('modResource', '{
"TemplateVarResources":{ "TemplateVar":{} } }',$c);На тестовом сайте чуть меньше 1000 ресурсов, при выполнении данного скрипта в консоли получаем ошибку Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8192 bytes)Мы сожрали всю память.Ставим лимит 100, в
$resources падает только 4 штуки. (хотя по идее он должен был вывести 100 штук) при увеличении число растет, но не упирается в лимит.При доступе к связанным объектам графа вообще в переменных код сниппетов вижу.
Что не так с getCollectionGraph в моем случае?
p.s. для чего это надо? При вызове $resource-getTVValue(x) для каждого ТВ, Мы обращаемся к БД. И если у нас 700 ресурсов по 50 tv параметров, то получаем 35000 отдельных запросов.
Комментарии: 4
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Хотите оптимизации — делайте запросы руками, механизмы типа getCollectionGraph 100% жутко прожорливы.
У меня не получается достучаться до значения, имени и ид всех ТВ ресурса.
Если мы добавим после вызова Графа
Я не получаю Объект содержащий все привязанные к данному ресурсу ТВшки.
Выполнить сначала GetCount что бы посчитать их количество и идти циклом?
Обратите внимание, что если у ресурса есть tv со значением по-умолчанию и оно не заполнено, либо установлено значение по-умолчанию, в выборке его не будет, т.к. MODX не создает записей modTemplateVarResource в базе для значений по-умолчанию.
Не знаю на сколько решение элегантное, но так мы не тянем те поля ресурса, что нам не нужны в память. работает быстро.