Fix oversight in datamapper.
authorCameron Ball <cameron@getapproved.com.au>
Mon, 17 Nov 2014 05:31:21 +0000 (13:31 +0800)
committerCameron Ball <cameron@getapproved.com.au>
Mon, 17 Nov 2014 05:31:21 +0000 (13:31 +0800)
DataAccess/DataMapper/Helpers/AbstractPopulationHelper.php

index a8b8db6..a3e518b 100644 (file)
@@ -54,205 +54,210 @@ class AbstractPopulationHelper
             $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