Example #1
0
 /**
  * Crafts and executes an SQL statement to insert the object into MySQL
  *
  * @param \Rhubarb\Stem\Models\Model $object
  */
 private function insertObject(Model $object)
 {
     $schema = $this->schema;
     $changes = $object->takeChangeSnapshot();
     $params = [];
     $columns = [];
     $sql = "INSERT INTO `{$schema->schemaName}`";
     $schemaColumns = $schema->getColumns();
     foreach ($changes as $columnName => $value) {
         $changeData = $changes;
         if (isset($schemaColumns[$columnName])) {
             $storageColumns = $schemaColumns[$columnName]->getStorageColumns();
             $transforms = $this->columnTransforms[$columnName];
             if ($transforms[1] !== null) {
                 $closure = $transforms[1];
                 $transformedData = $closure($changes);
                 if (is_array($transformedData)) {
                     $changeData = $transformedData;
                 } else {
                     $changeData[$columnName] = $transformedData;
                 }
             }
             foreach ($storageColumns as $storageColumnName => $storageColumn) {
                 $value = isset($changeData[$storageColumnName]) ? $changeData[$storageColumnName] : null;
                 $columns[] = "`" . $storageColumnName . "` = :" . $storageColumnName;
                 if ($value === null) {
                     $value = $storageColumn->defaultValue;
                 }
                 $params[$storageColumnName] = $value;
             }
         }
     }
     if (sizeof($columns) > 0) {
         $sql .= " SET " . implode(", ", $columns);
     } else {
         $sql .= " VALUES ()";
     }
     $id = self::executeInsertStatement($sql, $params);
     $object[$object->getUniqueIdentifierColumnName()] = $id;
 }