Qwarble 16 марта 2016 1 5
Добрый день! Есть следующая модель записей
  • 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);	
    }

    Модель такая (поля выбросил, чтоб не перегружать):
    <object class="modtestSession" table="modsession" extends="xPDOSimpleObject"><param name="wmode" value="opaque"></param>              
        <composite alias="SessionAnswer" class="modtestSessionAnswer" local="id" foreign="session_id" cardinality="many" owner="local" />
        <aggregate alias="Topic" class="modtestTopic" local="topic_id" foreign="id" cardinality="one" owner="foreign" />
    </object>
    
    <object class="modtestSessionAnswer" table="modsessionanswer" extends="xPDOSimpleObject"><param name="wmode" value="opaque"></param>
            <field key="session_id" dbtype="int" phptype="integer" null="false" default=""/>
            <field key="question_id" dbtype="int" phptype="integer" null="false" default=""/>
        <aggregate alias="Session" class="modtestSession" local="session_id" foreign="id" cardinality="one" owner="foreign" />
        <aggregate alias="Question" class="modtestQuestion" local="question_id" foreign="id" cardinality="one" owner="foreign" />
        <composite alias="SessionQuestionAnswer" class="modtestSessionAnswerQuestion" local="id" foreign="session_question_id" cardinality="many" owner="local" />
    </object>
    <object class="modtestSessionAnswerQuestion" table="modsessionanswer_question" extends="xPDOSimpleObject"><param name="wmode" value="opaque"></param>
            <field key="session_question_id" dbtype="int" phptype="integer" null="false" default=""/>
        <aggregate alias="SessionAnswer" class="modtestSessionAnswer" local="session_question_id" foreign="id" cardinality="one" owner="foreign" />
    </object>

    На втором уровне вложенности возвращает по 1 объекту.
    Это нормальное поведение getObjectGraph или я что-то делаю не так? На первом уровне возвращается правильное количество, но вот на втором уже по одному объекту. Если заменить getObjectGraph на getObject, то всё нормально.
5 комментариев
Fi1osof1
Fi1osof 16 марта 2016г в 20:02 #
Замените на getObject() и оставьте так, если работает. Все равно количество обращений к БД одно и то же.
Q
Qwarble 17 марта 2016г в 07:03 #
Спасибо! Мне казалось, что разное. По крайней мере SQL после getCollectionGraph выдаётся с LEFt JOIN по всем связям. А дальше, судя по коду, из плоской простыни методами HydrateParent и HydrateNode (через addMany, конечно) наполняется свойство _relatedObjects у объекта верхнего уровня. Так мне раньше казалось. Но на практике как-то странно это сработало. Я не прав?
Fi1osof1
Fi1osof 17 марта 2016г в 07:12 #
Там на столько дебри все, что я давно уже для себя решил: оно того не стоит. Left join тебя тут и губит, скорее всего. Ведь он только одну запись получает за раз, как будто это один-к-одному. А у тебя один-ко-многим.
Q
Qwarble 17 марта 2016г в 07:18 #
Нет, в плоской таблице все значения выдаются (перемножение таблиц). Особенности, видимо, уже при её обработке.
Спасибо! Значит возвращаемся к старым проверенным методам.
Fi1osof1
Fi1osof 17 марта 2016г в 07:33 #
Это все верно, что запрос возвращает больше одной строки. Но вот это тебе ни о чем не говорит?:
foreach($modx->getIterator('class', $q) as $obj){
    ...
    break;
}
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.