<model package="SA_modPlanner" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="SA_modPlanner" phpdoc-subpackage="model">
<object class="saItinerary" table="itineraries" extends="xPDOSimpleObject">
<field key="userId" dbtype="int" precision="5" phptype="integer" null="false" default="" index="index" />
<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="createdon" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="updatedon" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="true" default="" />
<composite alias="ItineraryItems" class="saItineraryItem" local="id" foreign="itineraryId" cardinality="many" owner="local" />
<aggregate alias="User" class="modUser" local="id" foreign="id" cardinality="one" owner="foreign" />
</object>
<object class="saItineraryItem" table="itinerary_items" extends="xPDOSimpleObject">
<field key="itineraryId" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="" index="index" />
<field key="source" dbtype="tinyint" precision="2" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="record" dbtype="smallint" precision="5" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="fkey" dbtype="smallint" precision="5" attributes="unsigned" phptype="integer" null="true" default="" />
<field key="category" dbtype="smallint" precision="5" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="sdate" dbtype="varchar" precision="10" phptype="string" null="true" default="" />
<field key="edate" dbtype="varchar" precision="10" phptype="string" null="true" default="" />
<field key="stime" dbtype="varchar" precision="10" phptype="string" null="true" default="" />
<field key="etime" dbtype="varchar" precision="10" phptype="string" null="true" default="" />
<field key="notes" dbtype="varchar" precision="255" phptype="string" null="true" default="" />
<field key="timestamp" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="true" default="" />
<field key="createdon" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="updatedon" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="true" default="" />
<aggregate alias="Itinerary" class="saItinerary" local="itineraryId" foreign="id" cardinality="one" owner="foreign" />
</object>
</model>

<aggregate alias="User" class="modUser" local="id" foreign="id" cardinality="one" owner="foreign" />
<aggregate alias="User" class="modUser" local="userId" foreign="id" cardinality="one" owner="foreign" />
Sorry, must have looked at this too early—I see now... They do not need to be fk’s though it might be useful to have those marked that way in your metadata. However, those are the old index creation methods from earlier releases of xPDO. The latest uses a new schema version, 1.1, that specifies indexes as separate elements and you’ll need to update your model to 1.1 if you are expecting to make this Extra work with other databases (like sqlsrv that we now support in xPDO 2.1/MODX 2.1 releases). See the index elements in the latest MODX schema files for an example. The attribute version="1.1" on your model element will tell the generator to look for the new index elements in mysql schemas. Documentation updates coming regarding this...
@pureppl: Thank you for taking a look and spotting that!
@Jason: Yes, the "userId" in my "saItinerary" class and the "itineraryId" in my "saItineraryItem" are not meant to be PKs, as the same id can occur multiple times in both tables (i.e., a user may have multiple itineraries, and an itinerary will have multiple items). Do I need to change the index attribute to index="fk" in those? And do all ids in aggregate and composite tags need to be PKs? Thanks for your feedback!
<?xml version="1.0" encoding="UTF-8"?>
<model version="1.1" package="SA_modPlanner" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="SA_modPlanner" phpdoc-subpackage="model">
<object class="saItinerary" table="itineraries" extends="xPDOSimpleObject">
<field key="userId" dbtype="int" precision="5" phptype="integer" null="false" default="" />
<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="createdon" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="updatedon" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="true" default="" />
<index alias="userId" name="userId" primary="false" unique="false" type="BTREE">
<column key="userId" collation="A" null="false" />
</index>
<composite alias="ItineraryItems" class="saItineraryItem" local="id" foreign="itineraryId" cardinality="many" owner="local" />
<aggregate alias="User" class="modUser" local="userId" foreign="id" cardinality="one" owner="foreign" />
</object>
<object class="saItineraryItem" table="itinerary_items" extends="xPDOSimpleObject">
<field key="itineraryId" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="source" dbtype="tinyint" precision="2" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="record" dbtype="smallint" precision="5" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="fkey" dbtype="smallint" precision="5" attributes="unsigned" phptype="integer" null="true" default="" />
<field key="category" dbtype="smallint" precision="5" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="sdate" dbtype="varchar" precision="10" phptype="string" null="true" default="" />
<field key="edate" dbtype="varchar" precision="10" phptype="string" null="true" default="" />
<field key="stime" dbtype="varchar" precision="10" phptype="string" null="true" default="" />
<field key="etime" dbtype="varchar" precision="10" phptype="string" null="true" default="" />
<field key="notes" dbtype="varchar" precision="255" phptype="string" null="true" default="" />
<field key="timestamp" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="true" default="" />
<field key="createdon" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="" />
<field key="updatedon" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="true" default="" />
<index alias="itineraryId" name="itineraryId" primary="false" unique="false" type="BTREE">
<column key="itineraryId" collation="A" null="false" />
</index>
<aggregate alias="Itinerary" class="saItinerary" local="itineraryId" foreign="id" cardinality="one" owner="foreign" />
</object>
</model>
$itinerary = $modx->newObject('saItinerary');
$itinerary->fromArray(array(
'name' => 'Yet Another Test Itinerary',
'userId' => $uid,
'createdon' => time()
));
$itinerary->save();