16 мар. 2016 г., 16:09

xpdo getCollectionGraph

Добрый день! Есть следующая модель записей
  • session
  • SessionAnswer
  • sessionQuestionAnswer
  • sessionQuestionAnswer
  • sessionQuestionAnswer
  • SessionAnswer
  • sessionQuestionAnswer
  • sessionQuestionAnswer
  • sessionQuestionAnswer
  • И следующий код $session = $modx->getObjectGraph('modtestSession','{"SessionAnswer":{"SessionQuestionAnswer":""}}',84); $sessionAnswers = $session->getMany('SessionAnswer'); //в моем случае объекту $session соответствует ровно 10 записей SessionAnswer, выводится все правильно echo "sessionAnswers: ".count($sessionAnswers); foreach($sessionAnswers as $sessionAnswer){ //А вот тут getMany возвращает только по одному объекту, хотя в среднем может быть от 1 до 6 объектов SessionQuestionAnswer на каждый SessionAnswer $sessionQuestionAnswers = $sessionAnswer->getMany('SessionQuestionAnswer'); echo "sessionQuestionAnswers: ".count($sessionQuestionAnswers); } Модель такая (поля выбросил, чтоб не перегружать): На втором уровне вложенности возвращает по 1 объекту. Это нормальное поведение getObjectGraph или я что-то делаю не так? На первом уровне возвращается правильное количество, но вот на втором уже по одному объекту. Если заменить getObjectGraph на getObject, то всё нормально.
Замените на getObject() и оставьте так, если работает. Все равно количество обращений к БД одно и то же.
Спасибо! Мне казалось, что разное. По крайней мере SQL после getCollectionGraph выдаётся с LEFt JOIN по всем связям. А дальше, судя по коду, из плоской простыни методами HydrateParent и HydrateNode (через addMany, конечно) наполняется свойство _relatedObjects у объекта верхнего уровня. Так мне раньше казалось. Но на практике как-то странно это сработало. Я не прав?
Там на столько дебри все, что я давно уже для себя решил: оно того не стоит. Left join тебя тут и губит, скорее всего. Ведь он только одну запись получает за раз, как будто это один-к-одному. А у тебя один-ко-многим.
Нет, в плоской таблице все значения выдаются (перемножение таблиц). Особенности, видимо, уже при её обработке. Спасибо! Значит возвращаемся к старым проверенным методам.
Это все верно, что запрос возвращает больше одной строки. Но вот это тебе ни о чем не говорит?:
foreach($modx->getIterator('class', $q) as $obj){ ... break; }

Добавить комментарий