/**
   * Loads map builder classes.
   *
   * This method is ORM dependant.
   *
   * @throws sfException
   */
  protected function loadMapBuilderClasses()
  {
    // we must load all map builder classes to be able to deal with foreign keys (cf. editSuccess.php template)
    $classes = sfFinder::type('file')->ignore_version_control()->name('*MapBuilder.php')->in(sfLoader::getModelDirs());
    foreach ($classes as $class)
    {
      $class_map_builder = basename($class, '.php');
      $maps[$class_map_builder] = new $class_map_builder();
      if (!$maps[$class_map_builder]->isBuilt())
      {
        $maps[$class_map_builder]->doBuild();
      }

      if ($this->className == str_replace('MapBuilder', '', $class_map_builder))
      {
        $this->map = $maps[$class_map_builder];
      }
    }
    if (!$this->map)
    {
      throw new sfException('The model class "'.$this->className.'" does not exist.');
    }

    $this->tableMap = $this->map->getDatabaseMap()->getTable(constant($this->className.'Peer::TABLE_NAME'));
  }
 public static function getRelatedClass($class, $middleClass)
 {
     $column = self::getRelatedColumn($class, $middleClass);
     // we must load all map builder classes
     $classes = sfFinder::type('file')->ignore_version_control()->name('*MapBuilder.php')->in(sfLoader::getModelDirs());
     foreach ($classes as $class) {
         $class_map_builder = basename($class, '.php');
         $map = new $class_map_builder();
         $map->doBuild();
     }
     $tableMap = call_user_func(array($middleClass . 'Peer', 'getTableMap'));
     return $tableMap->getDatabaseMap()->getTable($column->getRelatedTableName())->getPhpName();
 }
 /**
  * Dumps data to fixture from one or more tables.
  *
  * @param string directory or file to dump to
  * @param mixed  name or names of tables to dump (or all to dump all tables)
  * @param string connection name
  */
 public function dumpData($directory_or_file = null, $tables = 'all', $connectionName = 'propel')
 {
     $sameFile = true;
     if (is_dir($directory_or_file)) {
         // multi files
         $sameFile = false;
     } else {
         // same file
         // delete file
     }
     $this->con = Propel::getConnection($connectionName);
     // get tables
     if ('all' === $tables || is_null($tables)) {
         // load all map builder classes
         $files = sfFinder::type('file')->ignore_version_control()->name('*MapBuilder.php')->in(sfLoader::getModelDirs());
         foreach ($files as $file) {
             $mapBuilderClass = basename($file, '.php');
             $map = new $mapBuilderClass();
             $map->doBuild();
         }
         $dbMap = Propel::getDatabaseMap($connectionName);
         $tables = array();
         foreach ($dbMap->getTables() as $table) {
             $tables[] = $table->getPhpName();
         }
     } else {
         if (!is_array($tables)) {
             $tables = array($tables);
         }
     }
     $dumpData = array();
     // load map classes
     array_walk($tables, array($this, 'loadMapBuilder'));
     //$tables = $this->fixOrderingOfForeignKeyData($tables);
     foreach ($tables as $tableName) {
         $tableMap = $this->maps[$tableName]->getDatabaseMap()->getTable(constant($tableName . 'Peer::TABLE_NAME'));
         $hasParent = false;
         $haveParents = false;
         $fixColumn = null;
         foreach ($tableMap->getColumns() as $column) {
             $col = strtolower($column->getColumnName());
             if ($column->isForeignKey()) {
                 $relatedTable = $this->maps[$tableName]->getDatabaseMap()->getTable($column->getRelatedTableName());
                 if ($tableName === $relatedTable->getPhpName()) {
                     if ($hasParent) {
                         $haveParents = true;
                     } else {
                         $fixColumn = $column;
                         $hasParent = true;
                     }
                 }
             }
         }
         if ($haveParents) {
             // unable to dump tables having multi-recursive references
             continue;
         }
         // get db info
         $resultsSets = array();
         if ($hasParent) {
             $resultsSets = $this->fixOrderingOfForeignKeyDataInSameTable($resultsSets, $tableName, $fixColumn);
         } else {
             $resultsSets[] = $this->con->executeQuery('SELECT * FROM ' . constant($tableName . 'Peer::TABLE_NAME'));
         }
         foreach ($resultsSets as $rs) {
             if ($rs->getRecordCount() > 0 && !isset($dumpData[$tableName])) {
                 $dumpData[$tableName] = array();
             }
             while ($rs->next()) {
                 $pk = $tableName;
                 $values = array();
                 $primaryKeys = array();
                 $foreignKeys = array();
                 foreach ($tableMap->getColumns() as $column) {
                     $col = strtolower($column->getColumnName());
                     $isPrimaryKey = $column->isPrimaryKey();
                     if (is_null($rs->get($col))) {
                         continue;
                     }
                     if ($isPrimaryKey) {
                         $value = $rs->get($col);
                         $pk .= '_' . $value;
                         $primaryKeys[$col] = $value;
                     }
                     if ($column->isForeignKey()) {
                         $relatedTable = $this->maps[$tableName]->getDatabaseMap()->getTable($column->getRelatedTableName());
                         if ($isPrimaryKey) {
                             $foreignKeys[$col] = $rs->get($col);
                             $primaryKeys[$col] = $relatedTable->getPhpName() . '_' . $rs->get($col);
                         } else {
                             $values[$col] = $relatedTable->getPhpName() . '_' . $rs->get($col);
                         }
                     } elseif (!$isPrimaryKey || $isPrimaryKey && !$tableMap->isUseIdGenerator()) {
                         // We did not want auto incremented primary keys
                         $values[$col] = $rs->get($col);
                     }
                 }
                 if (count($primaryKeys) > 1 || count($primaryKeys) > 0 && count($foreignKeys) > 0) {
                     $values = array_merge($primaryKeys, $values);
                 }
                 $dumpData[$tableName][$pk] = $values;
             }
         }
     }
     // save to file(s)
     if ($sameFile) {
         file_put_contents($directory_or_file, Spyc::YAMLDump($dumpData));
     } else {
         $i = 0;
         foreach ($tables as $tableName) {
             if (!isset($dumpData[$tableName])) {
                 continue;
             }
             file_put_contents(sprintf("%s/%03d-%s.yml", $directory_or_file, ++$i, $tableName), Spyc::YAMLDump(array($tableName => $dumpData[$tableName])));
         }
     }
 }
예제 #4
0
 /**
  * Dumps data to fixture from one or more tables.
  *
  * @param string directory or file to dump to
  * @param mixed  name or names of tables to dump (or all to dump all tables)
  * @param string connection name
  */
 public function dumpData($directory_or_file = null, $tables = 'all', $connectionName = 'propel')
 {
     $sameFile = true;
     if (is_dir($directory_or_file)) {
         // multi files
         $sameFile = false;
     } else {
         // same file
         // delete file
     }
     $this->con = Propel::getConnection($connectionName);
     // get tables
     if ('all' === $tables || is_null($tables)) {
         // load all map builder classes
         $files = sfFinder::type('file')->name('*MapBuilder.php')->in(sfLoader::getModelDirs());
         foreach ($files as $file) {
             $mapBuilderClass = basename($file, '.php');
             $map = new $mapBuilderClass();
             $map->doBuild();
         }
         $dbMap = Propel::getDatabaseMap($connectionName);
         $tables = array();
         foreach ($dbMap->getTables() as $table) {
             $tables[] = $table->getPhpName();
         }
     } else {
         if (!is_array($tables)) {
             $tables = array($tables);
         }
     }
     $dumpData = array();
     // load map classes
     array_walk($tables, array($this, 'loadMapBuilder'));
     $tables = $this->fixOrderingOfForeignKeyData($tables);
     foreach ($tables as $tableName) {
         $tableMap = $this->maps[$tableName]->getDatabaseMap()->getTable(constant($tableName . 'Peer::TABLE_NAME'));
         // get db info
         $rs = $this->con->executeQuery('SELECT * FROM ' . constant($tableName . 'Peer::TABLE_NAME'));
         while ($rs->next()) {
             $pk = $tableName;
             $values = array();
             foreach ($tableMap->getColumns() as $column) {
                 $col = strtolower($column->getColumnName());
                 if ($column->isPrimaryKey()) {
                     $pk .= '_' . $rs->get($col);
                 } else {
                     if ($column->isForeignKey()) {
                         $relatedTable = $this->maps[$tableName]->getDatabaseMap()->getTable($column->getRelatedTableName());
                         $values[$col] = $relatedTable->getPhpName() . '_' . $rs->get($col);
                     } else {
                         $values[$col] = $rs->get($col);
                     }
                 }
             }
             if (!isset($dumpData[$tableName])) {
                 $dumpData[$tableName] = array();
             }
             $dumpData[$tableName][$pk] = $values;
         }
     }
     // save to file(s)
     if ($sameFile) {
         file_put_contents($directory_or_file, Spyc::YAMLDump($dumpData));
     } else {
         $i = 0;
         foreach ($tables as $tableName) {
             if (!isset($dumpData[$tableName])) {
                 continue;
             }
             file_put_contents(sprintf("%s/%03d-%s.yml", $directory_or_file, ++$i, $tableName), Spyc::YAMLDump(array($tableName => $dumpData[$tableName])));
         }
     }
 }