$accessor = $mapsHelper->getAccessor();\r
$property = $entity->{$accessor}();\r
\r
- switch(get_class($mapsHelper))\r
+ //sometimes children objects will be null, e.g., the banner for a simfile\r
+ //just skip them\r
+ if(!is_null($property)) \r
{\r
- case 'DataAccess\DataMapper\Helpers\VOMapsHelper':\r
- //we have a vo. Determine which way the reference is\r
- $voMapsIndex = self::getMapsNameFromEntityObject($property, $maps);\r
- $refDir = self::getReferenceDirection(\r
- $maps[$entityMapsIndex]['table'],\r
- $maps[$voMapsIndex]['table'],\r
- $entityMapsIndex,\r
- $mapsHelper->getTableName(),\r
- $db);\r
- \r
- switch($refDir)\r
- {\r
- // our table stores their ID, all we do is update\r
- // our reference.\r
- case self::REFERENCE_FORWARD:\r
- $voTableId = self::findVOInDB($maps, $property, $db);\r
- \r
- if($id)\r
- {\r
- $query .= sprintf('%s=%u, ',\r
- strtolower($mapsHelper->getTableName() . '_id'),\r
- $voTableId);\r
- } else {\r
- // we have a forward reference to a value object.\r
- // see if it exists first: \r
- if($voTableId)\r
+ switch(get_class($mapsHelper))\r
+ {\r
+ case 'DataAccess\DataMapper\Helpers\VOMapsHelper':\r
+ //we have a vo. Determine which way the reference is\r
+ $voMapsIndex = self::getMapsNameFromEntityObject($property, $maps);\r
+ $refDir = self::getReferenceDirection(\r
+ $maps[$entityMapsIndex]['table'],\r
+ $maps[$voMapsIndex]['table'],\r
+ $entityMapsIndex,\r
+ $mapsHelper->getTableName(),\r
+ $db);\r
+\r
+ switch($refDir)\r
+ {\r
+ // our table stores their ID, all we do is update\r
+ // our reference.\r
+ case self::REFERENCE_FORWARD:\r
+ $voTableId = self::findVOInDB($maps, $property, $db);\r
+\r
+ if($id)\r
{\r
- $queryColumnNamesAndValues[strtolower($mapsHelper->getTableName() . '_id')] = $voTableId;\r
+ $query .= sprintf('%s=%u, ',\r
+ strtolower($mapsHelper->getTableName() . '_id'),\r
+ $voTableId);\r
} else {\r
- //make a note that this field will need the id from another\r
- self::generateUpdateSaveQuery($maps, $property, NULL, $db, $queries);\r
- $queryColumnNamesAndValues[strtolower($mapsHelper->getTableName() . '_id')] = '%INDEX_REF_' . (count($queries)-1) . '%';\r
+ // we have a forward reference to a value object.\r
+ // see if it exists first: \r
+ if($voTableId)\r
+ {\r
+ $queryColumnNamesAndValues[strtolower($mapsHelper->getTableName() . '_id')] = $voTableId;\r
+ } else {\r
+ //make a note that this field will need the id from another\r
+ self::generateUpdateSaveQuery($maps, $property, NULL, $db, $queries);\r
+ $queryColumnNamesAndValues[strtolower($mapsHelper->getTableName() . '_id')] = '%INDEX_REF_' . (count($queries)-1) . '%';\r
+ }\r
}\r
- }\r
\r
- break;\r
- case self::REFERENCE_SELF:\r
- //no need to find ids, but we need the\r
- //column names\r
- $columns = self::resolveColumnNamesAndValues($maps, $property);\r
- foreach($columns as $columnName=>$columnValue)\r
- {\r
- if($id)\r
+ break;\r
+ case self::REFERENCE_SELF:\r
+ //no need to find ids, but we need the\r
+ //column names\r
+ $columns = self::resolveColumnNamesAndValues($maps, $property);\r
+ foreach($columns as $columnName=>$columnValue)\r
+ {\r
+ if($id)\r
+ {\r
+ //TODO: logic to detemine what the value is? i.e., string, int etc?\r
+ $query .= sprintf('%s="%s", ',\r
+ $columnName,\r
+ $columnValue\r
+ );\r
+ } else {\r
+ //TODO: logic to detemine what the value is? i.e., string, int etc?\r
+ $queryColumnNamesAndValues[$columnName] = sprintf('"%s"', $columnValue);\r
+ }\r
+ }\r
+\r
+ break;\r
+ case self::REFERENCE_BACK:\r
+ $voId = self::findVOInDB($maps,\r
+ $property,\r
+ $db,\r
+ array(strtolower($entityMapsIndex . '_id') => $id));\r
+ if($voId)\r
{\r
- //TODO: logic to detemine what the value is? i.e., string, int etc?\r
- $query .= sprintf('%s="%s", ',\r
- $columnName,\r
- $columnValue\r
- );\r
+ self::generateUpdateSaveQuery($maps, $property, $voId, $db, $queries); \r
} else {\r
- //TODO: logic to detemine what the value is? i.e., string, int etc?\r
- $queryColumnNamesAndValues[$columnName] = sprintf('"%s"', $columnValue);\r
+ $extra = array(strtolower($entityMapsIndex . '_id') => '%MAIN_QUERY_ID%');\r
+ self::generateUpdateSaveQuery($maps, $property, NULL, $db, $queries, $extra);\r
}\r
- }\r
+ break;\r
+ }\r
\r
- break;\r
- case self::REFERENCE_BACK:\r
- $voId = self::findVOInDB($maps,\r
- $property,\r
- $db,\r
- array(strtolower($entityMapsIndex . '_id') => $id));\r
- if($voId)\r
+ break;\r
+\r
+ // We should never update referenced entities, the db\r
+ // should always store an ID as a reference to them.\r
+ //\r
+ // In the case where we cannot find the entity in the database,\r
+ // throw an exception ?\r
+ case 'DataAccess\DataMapper\Helpers\EntityMapsHelper':\r
+ $subEntityMapsIndex = self::getMapsNameFromEntityObject($property, $maps);\r
+ $refDir = self::getReferenceDirection(\r
+ $maps[$entityMapsIndex]['table'],\r
+ $maps[$subEntityMapsIndex]['table'],\r
+ $entityMapsIndex,\r
+ $mapsHelper->getTableName(),\r
+ $db);\r
+\r
+ switch($refDir)\r
+ {\r
+ // our table stores their ID, all we do is update\r
+ // our reference.\r
+ case self::REFERENCE_FORWARD:\r
+ if($property->getId())\r
+ {\r
+ // we exist in db already, update our reference\r
+ if($id)\r
+ {\r
+ $query .= sprintf('%s=%u, ',\r
+ //strtolower($mapsHelper->getEntityName() . '_id'),\r
+ strtolower($mapsHelper->getTableName() . '_id'),\r
+ $property->getId());\r
+ } else {\r
+ //not in db yet. make new ref\r
+ //$queryColumnNamesAndValues[strtolower($mapsHelper->getEntityName() . '_id')] = $property->getId();\r
+ $queryColumnNamesAndValues[strtolower($mapsHelper->getTableName() . '_id')] = $property->getId();\r
+ }\r
+ } else {\r
+ // The entity we care about references an entity that\r
+ // has not yet been saved.\r
+ //\r
+ // TODO: Should we _try_ to save it? Or should\r
+ // it be enforced that entites already exist in the db?\r
+ // In the case of something like referencing a user entity,\r
+ // then for sure the user should already be saved because\r
+ // it makes no sense to assign a user at the time of simfile\r
+ // upload, they should have already completed the process.\r
+ // but could there be other entities where it does make sense\r
+ // for them to be created at the time of something else ?\r
+ throw new Exception(sprintf(\r
+ 'Could not find referenced entity, %s, in the database. Has it been saved yet?',\r
+ $mapsHelper->getEntityName()));\r
+ }\r
+ break;\r
+ }\r
+ break;\r
+ case 'DataAccess\DataMapper\Helpers\IntMapsHelper':\r
+ if($id)\r
+ {\r
+ //easy case, plain values in our table.\r
+ $query .= sprintf('%s=%u, ',\r
+ $mapsHelper->getColumnName(),\r
+ $property); \r
+ } else {\r
+ if(is_bool($property))\r
{\r
- self::generateUpdateSaveQuery($maps, $property, $voId, $db, $queries); \r
- } else {\r
- $extra = array(strtolower($entityMapsIndex . '_id') => '%MAIN_QUERY_ID%');\r
- self::generateUpdateSaveQuery($maps, $property, NULL, $db, $queries, $extra);\r
+ $property = ($property) ? '1' : '0';\r
}\r
- break;\r
- }\r
+ $queryColumnNamesAndValues[$mapsHelper->getColumnName()] = sprintf('%u', $property);\r
+ }\r
+ break;\r
+ case 'DataAccess\DataMapper\Helpers\VarcharMapsHelper':\r
+ if($id){\r
+ //easy case, plain values in our table.\r
+ $query .= sprintf('%s="%s", ',\r
+ $mapsHelper->getColumnName(),\r
+ $property); \r
+ } else {\r
+ $queryColumnNamesAndValues[$mapsHelper->getColumnName()] = sprintf('"%s"', $property);\r
+ }\r
\r
- break;\r
+ break;\r
\r
- // We should never update referenced entities, the db\r
- // should always store an ID as a reference to them.\r
- //\r
- // In the case where we cannot find the entity in the database,\r
- // throw an exception ?\r
- case 'DataAccess\DataMapper\Helpers\EntityMapsHelper':\r
- $subEntityMapsIndex = self::getMapsNameFromEntityObject($property, $maps);\r
- $refDir = self::getReferenceDirection(\r
- $maps[$entityMapsIndex]['table'],\r
- $maps[$subEntityMapsIndex]['table'],\r
- $entityMapsIndex,\r
- $mapsHelper->getTableName(),\r
- $db);\r
+ // I am making a bit of an assumption here. In my mind it only\r
+ // makes sense for an array of VOs to be stored in a different\r
+ // table in the DB since the main row can't possibly store\r
+ // different objects.\r
+ //\r
+ // in that regard, the way this works is that mapVOArrayToIds\r
+ // simply queries the DB and returns the VO ids in order then\r
+ // I assume that the object also has them in the same order\r
+ // (which it will if it is pulled out by this mapper.\r
+ //\r
+ // in the case of setting up a new entity, the VOs should never\r
+ // exist in the first place, so we just make them.\r
+ case 'DataAccess\DataMapper\Helpers\VOArrayMapsHelper':\r
+ if($id && isset($property[0]))\r
+ {\r
+ // If we assume that all elements in the array are the same then\r
+ // we can just use the first one to figure out which maps entry to use\r
\r
- switch($refDir)\r
- {\r
- // our table stores their ID, all we do is update\r
- // our reference.\r
- case self::REFERENCE_FORWARD:\r
- if($property->getId())\r
+ $subEntityMapsIndex = self::getMapsNameFromEntityObject($property[0], $maps);\r
+ $voIds = self::mapVOArrayToIds($maps[$subEntityMapsIndex]['table'],\r
+ array(strtolower($entityMapsIndex . '_id'), $id),\r
+ $db);\r
+\r
+ foreach($property as $index => $propertyArrayElement)\r
{\r
- // we exist in db already, update our reference\r
- if($id)\r
+ $extra = array(strtolower($entityMapsIndex . '_id') => $id);\r
+ if(isset($voIds[$index]))\r
{\r
- $query .= sprintf('%s=%u, ',\r
- //strtolower($mapsHelper->getEntityName() . '_id'),\r
- strtolower($mapsHelper->getTableName() . '_id'),\r
- $property->getId());\r
+ self::generateUpdateSaveQuery($maps, $propertyArrayElement, $voIds[$index], $db, $queries, $extra);\r
} else {\r
- //not in db yet. make new ref\r
- //$queryColumnNamesAndValues[strtolower($mapsHelper->getEntityName() . '_id')] = $property->getId();\r
- $queryColumnNamesAndValues[strtolower($mapsHelper->getTableName() . '_id')] = $property->getId();\r
+ self::generateUpdateSaveQuery($maps, $propertyArrayElement, NULL, $db, $queries, $extra);\r
}\r
- } else {\r
- // The entity we care about references an entity that\r
- // has not yet been saved.\r
- //\r
- // TODO: Should we _try_ to save it? Or should\r
- // it be enforced that entites already exist in the db?\r
- // In the case of something like referencing a user entity,\r
- // then for sure the user should already be saved because\r
- // it makes no sense to assign a user at the time of simfile\r
- // upload, they should have already completed the process.\r
- // but could there be other entities where it does make sense\r
- // for them to be created at the time of something else ?\r
- throw new Exception(sprintf(\r
- 'Could not find referenced entity, %s, in the database. Has it been saved yet?',\r
- $mapsHelper->getEntityName()));\r
}\r
- break;\r
- }\r
- break;\r
- case 'DataAccess\DataMapper\Helpers\IntMapsHelper':\r
- if($id)\r
- {\r
- //easy case, plain values in our table.\r
- $query .= sprintf('%s=%u, ',\r
- $mapsHelper->getColumnName(),\r
- $property); \r
- } else {\r
- if(is_bool($property))\r
- {\r
- $property = ($property) ? '1' : '0';\r
- }\r
- $queryColumnNamesAndValues[$mapsHelper->getColumnName()] = sprintf('%u', $property);\r
- }\r
- break;\r
- case 'DataAccess\DataMapper\Helpers\VarcharMapsHelper':\r
- if($id){\r
- //easy case, plain values in our table.\r
- $query .= sprintf('%s="%s", ',\r
- $mapsHelper->getColumnName(),\r
- $property); \r
- } else {\r
- $queryColumnNamesAndValues[$mapsHelper->getColumnName()] = sprintf('"%s"', $property);\r
- }\r
\r
- break;\r
-\r
- // I am making a bit of an assumption here. In my mind it only\r
- // makes sense for an array of VOs to be stored in a different\r
- // table in the DB since the main row can't possibly store\r
- // different objects.\r
- //\r
- // in that regard, the way this works is that mapVOArrayToIds\r
- // simply queries the DB and returns the VO ids in order then\r
- // I assume that the object also has them in the same order\r
- // (which it will if it is pulled out by this mapper.\r
- //\r
- // in the case of setting up a new entity, the VOs should never\r
- // exist in the first place, so we just make them.\r
- case 'DataAccess\DataMapper\Helpers\VOArrayMapsHelper':\r
- if($id && isset($property[0]))\r
- {\r
- // If we assume that all elements in the array are the same then\r
- // we can just use the first one to figure out which maps entry to use\r
- \r
- $subEntityMapsIndex = self::getMapsNameFromEntityObject($property[0], $maps);\r
- $voIds = self::mapVOArrayToIds($maps[$subEntityMapsIndex]['table'],\r
- array(strtolower($entityMapsIndex . '_id'), $id),\r
- $db);\r
- \r
- foreach($property as $index => $propertyArrayElement)\r
- {\r
- $extra = array(strtolower($entityMapsIndex . '_id') => $id);\r
- if(isset($voIds[$index]))\r
+ break;\r
+ } else {\r
+ foreach($property as $propertyArrayElement)\r
{\r
- self::generateUpdateSaveQuery($maps, $propertyArrayElement, $voIds[$index], $db, $queries, $extra);\r
- } else {\r
+ // TODO: TRICKY! Since this is a back-reference, it\r
+ // needs the ID of the object we're trying to save\r
+ // to complete\r
+ $extra = array(strtolower($entityMapsIndex . '_id') => '%MAIN_QUERY_ID%');\r
self::generateUpdateSaveQuery($maps, $propertyArrayElement, NULL, $db, $queries, $extra);\r
}\r
}\r
-\r
- break;\r
- } else {\r
- foreach($property as $propertyArrayElement)\r
- {\r
- // TODO: TRICKY! Since this is a back-reference, it\r
- // needs the ID of the object we're trying to save\r
- // to complete\r
- $extra = array(strtolower($entityMapsIndex . '_id') => '%MAIN_QUERY_ID%');\r
- self::generateUpdateSaveQuery($maps, $propertyArrayElement, NULL, $db, $queries, $extra);\r
- }\r
- }\r
+ }\r
}\r
}\r
// \r