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