<?xml version="1.0" encoding="UTF-8"?> <model package="webuser" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="webuser" phpdoc-subpackage="model"> <object class="webUser" table="user_webuser_attributes" extends="xPDOSimpleObject"> <field key="internalKey" dbtype="int" precision="10" phptype="integer" null="false" default="0" index="unique" /> <field key="first_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" /> <field key="last_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" /> <aggregate alias="User" class="modUser" local="internalKey" foreign="id" cardinality="one" owner="foreign" /> </object> </model>
<?php
/**
* @package webuser
*/
$base_path = !empty($base_path) ? $base_path : $modx->getOption('core_path').'components/webuser/';
$modx->addPackage('webuser',$base_path.'model/');
$user = $modx->getObject('modUser', 2);
$webuser = $modx->newObject('webUser');
$webuser->fromArray(array(
'first_name' => 'John',
'last_name' => 'Doe',
));
$user->addOne($webuser);
$user->save();
$webusers = $modx->getCollection('webUser');
echo 'Total: '.count($webusers);
(ERROR @ /index.php) No foreign key definition for parentClass: modUser using relation alias: webuser
<object class="webUser" extends="modUser">
<composite alias="MyProfile" class="myWebUserProfile" local="id" foreign="internalKey" cardinality="one" owner="local" />
</object>
<object class="myWebUserProfile" table="user_webuser_attributes" extends="xPDOSimpleObject">
<field key="internalKey" dbtype="int" precision="10" phptype="integer" null="false" default="0" index="unique" />
<field key="first_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" />
<field key="last_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" />
<aggregate alias="User" class="webUser" local="internalKey" foreign="id" cardinality="one" owner="foreign" />
</object>
<?php
/**
* @package webuser
*/
$base_path = !empty($base_path) ? $base_path : $modx->getOption('core_path').'components/webuser/';
$modx->addPackage('webuser',$base_path.'model/');
$user = $modx->getObjectGraph('webUser', '{"MyProfile":{}}', 2);
if (!is_object($user->MyProfile)) {
$user->addOne('MyProfile', $modx->newObject('myWebUserProfile', array(
'first_name' => 'John',
'last_name' => 'Doe',
));
$user->save();
}
$webusers = $modx->getCollection('myWebUserProfile');
<field key="internalKey" dbtype="int" precision="10" phptype="integer" null="false" default="0" index="unique" />
<aggregate alias="User" class="webUser" local="internalKey" foreign="id" cardinality="one" owner="foreign" />
<object class="webUser" extends="modUser">
<composite alias="MyProfile" class="myWebUserProfile" local="username" foreign="nickname" cardinality="one" owner="local" />
</object>
<object class="myWebUserProfile" table="user_webuser_attributes" extends="xPDOSimpleObject">
<field key="nickname" dbtype="varchar" precision="100" phptype="string" null="false" default="0" index="index" />
<field key="first_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" />
<field key="last_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" />
<aggregate alias="User" class="webUser" local="nickname" foreign="username" cardinality="one" owner="foreign" />
</object>
Not at all; most all foreign key relationships in relational databases are maintained using foreign keys to auto-generated primary keys.
Do not be discouraged relationships with auto-generated numbers to a relationship?
For cases of failure and reconstruction of databases or backup
No, because username may change, the primary key will not.
Would not it be better in a username is than unique?
Fatal error: Call to a member function addOne() on a non-object in /home/revoluti/public_html/core/components/webuser/trunk/core/components/webuser/snippet.webuser.php on line 10
// Line 10
$user->addOne('MyProfile', $modx->newObject('myWebUserProfile', array(
'first_name' => 'John',
'last_name' => 'Doe',
)));
$user = $modx->getObject('modUser', 2);
// get user with id of 2
$user = $modx->getObjectGraph('webUser', '{"MyProfile":{}}', 2);
<?xml version="1.0" encoding="UTF-8"?>
<model package="webuser" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="webuser" phpdoc-subpackage="model">
<object class="webUser" table="users" extends="modUser">
<composite alias="MyProfile" class="myWebUserProfile" local="id" foreign="internalKey" cardinality="one" owner="local" />
</object>
<object class="myWebUserProfile" table="user_webuser_attributes" extends="xPDOSimpleObject">
<field key="internalKey" dbtype="int" precision="10" phptype="integer" null="false" default="0" index="unique" />
<field key="first_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" />
<field key="last_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" />
<aggregate alias="User" class="webUser" local="internalKey" foreign="id" cardinality="one" owner="foreign" />
</object>
</model>
<?php
/**
* @package webuser
*/
$base_path = !empty($base_path) ? $base_path : $modx->getOption('core_path').'components/webuser/';
$modx->addPackage('webuser',$base_path.'model/');
$user = $modx->getObjectGraph('webUser', '{"MyProfile":{}}', 2);
if (!is_object($user->MyProfile)) {
$user->addOne('MyProfile', $modx->newObject('myWebUserProfile', array(
'first_name' => 'John',
'last_name' => 'Doe',
)));
$user->save();
}
$webusers = $modx->getCollection('myWebUserProfile');
echo 'Total: '.count($users);
?>
No.
Should I have re-built the modx schema originally after creating my package?
Or maybe the changes I made to the modx schema are persisting even though I removed the objects and my package is actually still not being recognized. Did I miss some obvious step and then trigger it inadvertently by rebuilding the modx schema?No, I’m pretty sure you just added your classes to the core modx maps. I can guarantee there’s a good chance that will break in future MODx updates.
<?php
/**
* @package webuser
*/
$base_path = !empty($base_path) ? $base_path : $modx->getOption('core_path').'components/webuser/';
$modx->addPackage('webuser',$base_path.'model/');
$user = $modx->getObjectGraph('webUser', '{"MyProfile":{}}', 2);
if (!is_object($user->MyProfile)) {
$user->addOne($modx->newObject('myWebUserProfile', array(
'first_name' => 'John',
'last_name' => 'Doe',
)), 'MyProfile');
$user->save();
} else { echo "Here------> ".$user->MyProfile->get('first_name')."<br>"; }
$webusers = $modx->getCollection('myWebUserProfile');
echo 'Total: '.count($webusers);
?>
<?xml version="1.0" encoding="UTF-8"?>
<model package="webuser" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="webuser" phpdoc-subpackage="model">
<object class="webUser" table="users" extends="modUser">
<composite alias="MyProfile" class="myWebUserProfile" key="id" local="id" foreign="internalKey" cardinality="one" owner="local" />
</object>
<object class="myWebUserProfile" table="user_webuser_attributes" extends="xPDOSimpleObject">
<field key="internalKey" dbtype="int" precision="10" phptype="integer" null="false" default="0" index="unique" />
<field key="first_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" />
<field key="last_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" />
<aggregate alias="User" class="webUser" key="id" local="internalKey" foreign="id" cardinality="one" owner="foreign" />
</object>
</model>
No, I’m pretty sure you just added your classes to the core modx maps. I can guarantee there’s a good chance that will break in future MODx updates.No doubt, and that’s exactly why I’m trying to figure this out. I did remove the classes and rebuild, will that not remove the previously added maps?
<?php
$prefix='myprefix';
$packageName = 'mypackage';
$restrictPrefix = true;
$manager= $modx->getManager();
$generator= $manager->getGenerator();
//Use this to create a schema from an existing database
$xml= $generator->writeSchema($modx->getOption('core_path') . 'components/'.$packageName.'/model/schema/'.$packageName.'.mysql.schema.xml', $packageName, 'xPDOObject', $prefix, $restrictPrefix);
//Use this to generate classes and maps from your schema
// NOTE: by default, only maps are overwritten; delete class files if you want to regenerate classes
$generator->parseSchema($modx->getOption('core_path') . 'components/'.$packageName.'/model/schema/'.$packageName.'.mysql.schema.xml', $modx->getOption('core_path') . 'components/'.$packageName.'/model/');