We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 23334
    • 2 Posts
    I am new to MODx and xPDO and may just be missing a key concept or two...

    I am trying to use getMany with a parent object that is instantiated with getCollection.

    First, if I instantiate the parent object with getObject all is well, getMany returns the 12 objects with event_id 26:

    $Eventobj = $modx->getObject('CcuEvents',array('id' => 26)); 
    $Schdobjects = $Eventobj->getMany('Teamschd');
    foreach($Schdobjects as $Schdobject) {
      $schddata = $Schdobject->toArray();
      ...
    }
    


    But when I instantiate the parent object with getCollection I get this error when accessing the child objects:
    Call to undefined method modX::toArray()

    $c = $modx->newQuery('CcuEvents');
    $c->where(array('YEAR(CcuEvents.eventdate) = '.$rptyear));
    $c->where(array('title' => $eventtitle),xPDOQuery::SQL_AND);
    $c->sortby('CcuEvents.eventdate','ASC');
    
    $Eventobjects = $modx->getCollection('CcuEvents',$c); 
    
    foreach($Eventobjects as $Eventobject) {
      $eventdata = $Eventobject->toArray();
    ...
    
      if (is_object($Eventobject)) { 
        echo "\$Eventobject is VALID<br>";
        echo "Class: ".get_class($Eventobject).", Parent Class: ".get_parent_class($Eventobject)."<br>";
    	echo "Class methods: </p>";
    	echo print_r(get_class_methods($Eventobject));
      }
    
      $Schdobjects = $Eventobject->getMany(Teamschd);
    
      foreach($Schdobjects as $Schdobject) {
        $schddata = $Schdobject->toArray();
        ...
      }
    }
    


    I don’t understand why the foreach fails on the child objects when the parent object is instantiated with getCollection rather than getObject. The output from the is_object statements confirms that $Eventobject is valid and the getMany method is available:

    $Eventobject is VALID
    Class: CcuEvents_mysql, Parent Class: CcuEvents
    Class methods:
    Array ( [0] => _loadRows [1] => _loadInstance [2] => _loadCollectionInstance [3] => load [4] => loadCollection [5] => loadCollectionGraph [6] => getSelectColumns [7] => __construct [8] => getOption [9] => setOption [10] => set [11] => get [12] => getOne [13] => getMany [14] => addOne [15] => addMany [16] => save [17] => remove [18] => getPrimaryKey [19] => getPK [20] => getPKType [21] => getFKClass [22] => getFKDefinition [23] => getFieldName [24] => toArray [25] => fromArray [26] => addValidationRule [27] => removeValidationRules [28] => getValidator [29] => _loadValidation [30] => validate [31] => isValidated [32] => isLazy [33] => toJSON [34] => fromJSON [35] => encode [36] => isDirty [37] => setDirty [38] => isNew ) 1

    BTW, I have also tried to accomplish this using getObjectGraph to hydrate the child objects using Shawns example:

    $EventCollection = $modx->getCollectionGraph('CcuEvents', array('Teamschd' => array()), 26);
    foreach ($EventCollection as $Schdobject) {
      if (is_object($Schdobject)) {
        $schddata = $Schdobject->toArray();
        $schddata[gamedate] = $Schdobject->Teamschd->get('gamedate');
        $schddata[gametime] = $Schdobject->Teamschd->get('gametime');
        $schddata[field] = $Schdobject->Teamschd->get('field');
        $schddata[hometeam] = $Schdobject->Teamschd->get('hometeam');
        $schddata[awayteam] = $Schdobject->Teamschd->get('awayteam');
        print_r($schddata);
      }
    }
    

    but receive Call to a member function get() on a non-object

    Here is the relevant portion of the schema:

    <?xml version="1.0" encoding="UTF-8"?>
    <model package="ccu" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
      <object class="BobTeamschd" table="bob_teamschd" extends="xPDOSimpleObject">
        <field key="event_id" dbtype="int" precision="10" phptype="integer" null="false" index="index" />
        <field key="gamedate" dbtype="date" phptype="date" null="false" index="index" />
        <field key="gametime" dbtype="time" phptype="string" null="false" index="index" />
        <field key="field" dbtype="tinyint" precision="4" phptype="integer" null="false" index="index" />
        <field key="hometeam" dbtype="varchar" precision="120" phptype="string" null="false" default="TBA" index="index" />
        <field key="awayteam" dbtype="varchar" precision="120" phptype="string" null="false" default="TBA" index="index" />
        ...
        <index alias="event_id" name="event_id" primary="false" unique="false" type="BTREE" >
          <column key="event_id" length="" collation="A" null="false" />
        </index>
        <aggregate alias="Event" class="CcuEvents" local="event_id" foreign="id" cardinality="one" owner="foreign" />
      </object>
    
      <object class="CcuEvents" table="ccu_events" extends="xPDOSimpleObject">
        ...
        <index alias="id" name="id" primary="false" unique="true" type="BTREE" >
          <column key="id" length="" collation="A" null="false" />
        </index>
        <aggregate alias="Teamschd" class="BobTeamschd" local="id" foreign="event_id" cardinality="many" owner="local" />
      </object>
    </model>
    


    Can you suggest a resolution?
    Thanks
      • 3749
      • 24,544 Posts
      Offhand, I don’t see anything wrong, but you should always test xPDO return values before calling any object methods:


      $Eventobjects = $modx->getCollection('CcuEvents',$c);
      
      if (!empty ($Eventobjects)) {
          foreach($Eventobjects as $Eventobject) {
             $eventdata = $Eventobject->toArray();
          ...
          }
      }


      The most likely problem is a malformed query that is not returning anything.
        Did I help you? Buy me a beer
        Get my Book: MODX:The Official Guide
        MODX info for everyone: http://bobsguides.com/modx.html
        My MODX Extras
        Bob's Guides is now hosted at A2 MODX Hosting