/** * Uses a builder class to create the output class. * This method assumes that the DataModelBuilder class has been initialized with the build properties. * * @param OMBuilder $builder * @param boolean $overwrite Whether to overwrite existing files with te new ones (default is YES). * * @todo -cPropelOMTask Consider refactoring build() method into AbstractPropelDataModelTask (would need to be more generic). * @return int */ protected function build(OMBuilder $builder, $overwrite = true) { $path = $builder->getClassFilePath(); $this->ensureDirExists(dirname($path)); $_f = new PhingFile($this->getOutputDirectory(), $path); // skip files already created once if ($_f->exists() && !$overwrite) { $this->log("\t-> (exists) " . $builder->getClassFilePath(), Project::MSG_VERBOSE); return 0; } $script = $builder->build(); foreach ($builder->getWarnings() as $warning) { $this->log($warning, Project::MSG_WARN); } // skip unchanged files if ($_f->exists() && $script == $_f->contents()) { $this->log("\t-> (unchanged) " . $builder->getClassFilePath(), Project::MSG_VERBOSE); return 0; } // write / overwrite new / changed files $action = $_f->exists() ? 'Updating' : 'Creating'; $this->log(sprintf("\t-> %s %s (table: %s, builder: %s)", $action, $builder->getClassFilePath(), $builder->getTable()->getName(), get_class($builder))); file_put_contents($_f->getAbsolutePath(), $script); return 1; }
/** * Returns file to inject, or false if none specified. * * @param OMBuilder $builder * @param string $type * @return string|bool */ public function inject($builder, $type) { if ($file = $this->getParameter($type)) { $path = $builder->getBuildProperty('projectDir') . DIRECTORY_SEPARATOR . $file; if (!file_exists($path)) { throw new Exception('Inject-file doesnt exist: ' . $path); } return file_get_contents($path); } return false; }
/** * Uses a builder class to create the output class. * This method assumes that the DataModelBuilder class has been initialized with the build properties. * @param OMBuilder $builder * @param boolean $overwrite Whether to overwrite existing files with te new ones (default is YES). * @todo -cPropelOMTask Consider refactoring build() method into AbstractPropelDataModelTask (would need to be more generic). */ protected function build(OMBuilder $builder, $overwrite = true) { $path = $builder->getClassFilePath(); $this->ensureDirExists(dirname($path)); $_f = new PhingFile($this->getOutputDirectory(), $path); if ($overwrite || !$_f->exists()) { $this->log("\t\t-> " . $builder->getClassname() . " [builder: " . get_class($builder) . "]"); $script = $builder->build(); file_put_contents($_f->getAbsolutePath(), $script); foreach ($builder->getWarnings() as $warning) { $this->log($warning, Project::MSG_WARN); } } else { $this->log("\t\t-> (exists) " . $builder->getClassname()); } }
protected function addReorder(&$script) { $this->builder->declareClasses('Propel'); $peerClassname = $this->peerClassname; $columnGetter = 'get' . $this->behavior->getColumnForParameter('rank_column')->getPhpName(); $columnSetter = 'set' . $this->behavior->getColumnForParameter('rank_column')->getPhpName(); $script .= "\n/**\n * Reorder a set of sortable objects based on a list of id/position\n * Beware that there is no check made on the positions passed\n * So incoherent positions will result in an incoherent list\n *\n * @param array \$order id => rank pairs\n * @param PropelPDO \$con optional connection\n * @return boolean true if the reordering took place, false if a database problem prevented it\n * @throws Exception\n */\npublic function reorder(array \$order, PropelPDO \$con = null)\n{\n if (\$con === null) {\n \$con = Propel::getConnection({$peerClassname}::DATABASE_NAME);\n }\n\n \$con->beginTransaction();\n try {\n \$ids = array_keys(\$order);\n \$objects = \$this->findPks(\$ids, \$con);\n foreach (\$objects as \$object) {\n \$pk = \$object->getPrimaryKey();\n if (\$object->{$columnGetter}() != \$order[\$pk]) {\n \$object->{$columnSetter}(\$order[\$pk]);\n \$object->save(\$con);\n }\n }\n \$con->commit();\n\n return true;\n } catch (Exception \$e) {\n \$con->rollback();\n throw \$e;\n }\n}\n"; }
/** * Constructs a new PeerBuilder subclass. */ public function __construct(Table $table) { parent::__construct($table); $this->basePeerClassname = $this->basePeerClass = $this->getBasePeer($table); $pos = strrpos($this->basePeerClassname, '.'); if ($pos !== false) { $this->basePeerClassname = substr($this->basePeerClassname, $pos + 1); } }
public function getNamespace() { if ($namespace = parent::getNamespace()) { if ($this->getGeneratorConfig() && ($omns = $this->getGeneratorConfig()->getBuildProperty('namespaceOm'))) { return $namespace . '\\' . $omns; } else { return $namespace; } } }
/** * @param string $script */ protected function addDeleteFromCache(&$script) { $peerClassName = $this->builder->getStubPeerBuilder()->getClassname(); $script .= ' /** * @return boolean success or failure */ public function deleteFromCache() { return ' . $peerClassName . '::cacheDelete($this->getCacheKey()); } '; }
protected function addShiftRank(&$script) { $useScope = $this->behavior->useScope(); $peerClassname = $this->peerClassname; $script .= "\n/**\n * Adds \$delta to all Rank values that are >= \$first and <= \$last.\n * '\$delta' can also be negative.\n *\n * @param int \$delta Value to be shifted by, can be negative\n * @param int \$first First node to be shifted\n * @param int \$last Last node to be shifted"; if ($useScope) { $script .= "\n * @param mixed \$scope Scope to use for the shift. Scalar value (single scope) or array"; } $script .= "\n * @param PropelPDO \$con Connection to use.\n */\npublic static function shiftRank(\$delta, \$first = null, \$last = null, " . ($useScope ? "\$scope = null, " : "") . "PropelPDO \$con = null)\n{\n if (\$con === null) {\n \$con = Propel::getConnection({$peerClassname}::DATABASE_NAME, Propel::CONNECTION_WRITE);\n }\n\n \$whereCriteria = {$this->queryClassname}::create();\n if (null !== \$first) {\n \$whereCriteria->add({$peerClassname}::RANK_COL, \$first, Criteria::GREATER_EQUAL);\n }\n if (null !== \$last) {\n \$whereCriteria->addAnd({$peerClassname}::RANK_COL, \$last, Criteria::LESS_EQUAL);\n }"; if ($useScope) { $script .= "\n {$this->peerClassname}::sortableApplyScopeCriteria(\$whereCriteria, \$scope);"; } $script .= "\n\n \$valuesCriteria = new Criteria({$peerClassname}::DATABASE_NAME);\n \$valuesCriteria->add({$peerClassname}::RANK_COL, array('raw' => {$peerClassname}::RANK_COL . ' + ?', 'value' => \$delta), Criteria::CUSTOM_EQUAL);\n\n {$this->builder->getPeerBuilder()->getBasePeerClassname()}::doUpdate(\$whereCriteria, \$valuesCriteria, \$con);\n {$peerClassname}::clearInstancePool();\n}\n"; }
protected function addDoSelectWithI18n(&$script) { $table = $this->getTable(); $thisTableObjectBuilder = OMBuilder::getNewObjectBuilder($table); $className = $table->getPhpName(); $pks = $table->getPrimaryKey(); $pk = PeerBuilder::getColumnName($pks[0], $className); // get i18n table name and culture column name foreach ($table->getReferrers() as $fk) { $tblFK = $fk->getTable(); if ($tblFK->getName() == $table->getAttribute('i18nTable')) { $i18nClassName = $tblFK->getPhpName(); // FIXME $i18nPeerClassName = $i18nClassName . 'Peer'; $i18nTable = $table->getDatabase()->getTable($tblFK->getName()); $i18nTableObjectBuilder = OMBuilder::getNewObjectBuilder($i18nTable); $i18nTablePeerBuilder = OMBuilder::getNewPeerBuilder($i18nTable); $i18nPks = $i18nTable->getPrimaryKey(); $i18nPk = PeerBuilder::getColumnName($i18nPks[0], $i18nClassName); $culturePhpName = ''; $cultureColumnName = ''; foreach ($tblFK->getColumns() as $col) { if ("true" === strtolower($col->getAttribute('isCulture'))) { $culturePhpName = $col->getPhpName(); $cultureColumnName = PeerBuilder::getColumnName($col, $i18nClassName); } } } } $script .= "\n\n /**\n * Selects a collection of {$className} objects pre-filled with their i18n objects.\n *\n * @return array Array of {$className} objects.\n * @throws PropelException Any exceptions caught during processing will be\n * rethrown wrapped into a PropelException.\n */\n public static function doSelectWithI18n(Criteria \$c, \$culture = null, \$con = null)\n {\n if (\$culture === null)\n {\n \$culture = sfPropel::getDefaultCulture();\n }\n"; if (DataModelBuilder::getBuildProperty('builderAddBehaviors')) { $script .= "\n\n foreach (sfMixer::getCallables('{$this->getClassname()}:doSelectJoin:doSelectJoin') as \$callable)\n {\n call_user_func(\$callable, '{$this->getClassname()}', \$c, \$con);\n }\n\n"; } $script .= "\n // Set the correct dbName if it has not been overridden\n if (\$c->getDbName() == Propel::getDefaultDB())\n {\n \$c->setDbName(self::DATABASE_NAME);\n }\n\n " . $this->getPeerClassname() . "::addSelectColumns(\$c);\n \$startcol = (" . $this->getPeerClassname() . "::NUM_COLUMNS - " . $this->getPeerClassname() . "::NUM_LAZY_LOAD_COLUMNS) + 1;\n\n " . $i18nPeerClassName . "::addSelectColumns(\$c);\n\n \$c->addJoin(" . $pk . ", " . $i18nPk . ");\n \$c->add(" . $cultureColumnName . ", \$culture);\n\n \$rs = " . $this->basePeerClassname . "::doSelect(\$c, \$con);\n \$results = array();\n\n while(\$rs->next()) {\n"; if ($table->getChildrenColumn()) { $script .= "\n \$omClass = " . $this->getPeerClassname() . "::getOMClass(\$rs, 1);\n"; } else { $script .= "\n \$omClass = " . $this->getPeerClassname() . "::getOMClass();\n"; } $script .= "\n \$cls = Propel::import(\$omClass);\n \$obj1 = new \$cls();\n \$obj1->hydrate(\$rs);\n \$obj1->setCulture(\$culture);\n"; // if ($i18nTable->getChildrenColumn()) { $script .= "\n \$omClass = " . $i18nTablePeerBuilder->getPeerClassname() . "::getOMClass(\$rs, \$startcol);\n"; // } else { // $script .= " // \$omClass = ".$i18nTablePeerBuilder->getPeerClassname()."::getOMClass(); //"; // } $script .= "\n \$cls = Propel::import(\$omClass);\n \$obj2 = new \$cls();\n \$obj2->hydrate(\$rs, \$startcol);\n\n \$obj1->set" . $i18nClassName . "ForCulture(\$obj2, \$culture);\n \$obj2->set" . $className . "(\$obj1);\n\n \$results[] = \$obj1;\n }\n return \$results;\n }\n"; }
public function build() { $phpDir = $this->getBuildProperty('phpDir'); $fassadePath = $phpDir . DIRECTORY_SEPARATOR . $this->getClassFilePath(); if (in_array($this->getBuildProperty('behaviorProviderCachefile'), array('true', 'on', 'yes', '1'))) { $outputDir = $this->getBuildProperty('outputDir'); $cacheFile = $outputDir . DIRECTORY_SEPARATOR . 'providerCache.json'; $className = $this->getClassname(); $package = $this->getPackage(); $nameSpace = $this->getNamespace(); // Check if a special constant has been defined - if not, this is the first run of // and Provider build, so we need to clear the cache. if (!defined('BEHAVIOR_PROVIDER_FASSADE_CACHE_CLEARED') || true != BEHAVIOR_PROVIDER_FASSADE_CACHE_CLEARED) { if (!file_exists($outputDir)) { mkdir($outputDir); } if (file_exists($cacheFile)) { unlink($cacheFile); } touch($cacheFile); define('BEHAVIOR_PROVIDER_FASSADE_CACHE_CLEARED', true); } $cache = (array) json_decode(file_get_contents($cacheFile), true); if (JSON_ERROR_NONE == json_last_error()) { $cache[] = array('package' => $package, 'namespace' => $nameSpace, 'modelName' => str_replace('Provider', '', $className), 'providerName' => $className); file_put_contents($cacheFile, json_encode($cache)); } } if (file_exists($fassadePath)) { // Fassade already exists. // It is not possible to just stop the process here and continue with the next file, // so we return the source string just as it is in the current file, so it does not get overwritten $sourceString = file_get_contents($fassadePath); } else { // Fassade does not exist yet, so we build it $sourceString = parent::build(); } return $sourceString; }
public static function getRefRelatedBySuffix(ForeignKey $fk) { return parent::getRefRelatedBySuffix($fk); }
public function getPackage() { return parent::getPackage(); }
public function getRealClassname() { return parent::getClassname(); }
/** * Adds the doOnDeleteSetNull() method, which provides ON DELETE SET NULL emulation. * @param string &$script The script will be modified in this method. */ protected function addDoOnDeleteSetNull(&$script) { $table = $this->getTable(); $script .= "\n /**\n * This is a method for emulating ON DELETE SET NULL DBs that don't support this\n * feature (like MySQL or SQLite).\n *\n * This method is not very speedy because it must perform a query first to get\n * the implicated records and then perform the deletes by calling those Peer classes.\n *\n * This method should be used within a transaction if possible.\n *\n * @param Criteria \$criteria\n * @param Connection \$con\n * @return void\n */\n protected static function doOnDeleteSetNull(Criteria \$criteria, Connection \$con)\n {\n\n // first find the objects that are implicated by the \$criteria\n \$objects = " . $this->getPeerClassname() . "::doSelect(\$criteria, \$con);\n foreach(\$objects as \$obj) {\n"; // This logic is almost exactly the same as that in doOnDeleteCascade() // it may make sense to refactor this, provided that thigns don't // get too complicated. foreach ($table->getReferrers() as $fk) { // $fk is the foreign key in the other table, so localTableName will // actually be the table name of other table $tblFK = $fk->getTable(); $refTablePeerBuilder = OMBuilder::getNewPeerBuilder($tblFK); if (!$tblFK->isForReferenceOnly()) { // we can't perform operations on tables that are // not within the schema (i.e. that we have no map for, etc.) $fkClassName = $tblFK->getPhpName(); // i'm not sure whether we can allow delete setnull for foreign keys // within the same table? perhaps we can? if ($fk->getOnDelete() == ForeignKey::SETNULL && $fk->getTable()->getName() != $table->getName()) { // backwards on purpose $columnNamesF = $fk->getLocalColumns(); $columnNamesL = $fk->getForeignColumns(); // should be same num as foreign $script .= "\n // set fkey col in related {$fkClassName} rows to NULL\n \$selectCriteria = new Criteria(" . $this->getPeerClassname() . "::DATABASE_NAME);\n \$updateValues = new Criteria(" . $this->getPeerClassname() . "::DATABASE_NAME);"; for ($x = 0, $xlen = count($columnNamesF); $x < $xlen; $x++) { $columnFK = $tblFK->getColumn($columnNamesF[$x]); $columnL = $table->getColumn($columnNamesL[$x]); $script .= "\n \$selectCriteria->add(" . $refTablePeerBuilder->getColumnConstant($columnFK) . ", \$obj->get" . $columnL->getPhpName() . "());\n \$updateValues->add(" . $refTablePeerBuilder->getColumnConstant($columnFK) . ", null);\n"; } $script .= "\n {$this->basePeerClassname}::doUpdate(\$selectCriteria, \$updateValues, \$con); // use BasePeer because generated Peer doUpdate() methods only update using pkey\n"; } // if setnull && fkey table name != curr table name } // if not for ref only } // foreach foreign keys $script .= "\n }\n }\n"; }
/** * Checks whether any registered behavior on that table has a modifier for a hook * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" * @param string &$script The script will be modified in this method. */ public function applyBehaviorModifier($hookName, &$script, $tab = " ") { return parent::applyBehaviorModifier($hookName, 'TableMapBuilderModifier', $script, $tab); }
/** * Return the constant for a given column. * * @param string $columnName * @param OMBuilder $builder * * @return string */ protected function getColumnConstant($columnName, OMBuilder $builder) { return $builder->getColumnConstant($this->getColumnForParameter($columnName)); }
protected function addDoSelectWithI18n(&$script) { $table = $this->getTable(); $thisTableObjectBuilder = OMBuilder::getNewObjectBuilder($table); $className = $table->getPhpName(); $pks = $table->getPrimaryKey(); $pk = PeerBuilder::getColumnName($pks[0], $className); // get i18n table name and culture column name foreach ($table->getReferrers() as $fk) { $tblFK = $fk->getTable(); if ($tblFK->getName() == $table->getAttribute('i18nTable')) { $i18nClassName = $tblFK->getPhpName(); // FIXME $i18nPeerClassName = $i18nClassName.'Peer'; $i18nTable = $table->getDatabase()->getTable($tblFK->getName()); $i18nTableObjectBuilder = OMBuilder::getNewObjectBuilder($i18nTable); $i18nTablePeerBuilder = OMBuilder::getNewPeerBuilder($i18nTable); $i18nPks = $i18nTable->getPrimaryKey(); $i18nPk = PeerBuilder::getColumnName($i18nPks[0], $i18nClassName); $culturePhpName = ''; $cultureColumnName = ''; foreach ($tblFK->getColumns() as $col) { if (('true' == trim(strtolower($col->getAttribute('isCulture'))))) { $culturePhpName = $col->getPhpName(); $cultureColumnName = PeerBuilder::getColumnName($col, $i18nClassName); } } } } $script .= " /** * Selects a collection of $className objects pre-filled with their i18n objects. * * @return array Array of $className objects. * @throws PropelException Any exceptions caught during processing will be * rethrown wrapped into a PropelException. */ public static function doSelectWithI18n(Criteria \$c, \$culture = null, PropelPDO \$con = null) { // we're going to modify criteria, so copy it first \$c = clone \$c; if (\$culture === null) { \$culture = sfPropel::getDefaultCulture(); } "; if ($this->getBuildProperty('builderAddBehaviors')) { $script .= " foreach (sfMixer::getCallables('{$this->getClassname()}:doSelectJoin:doSelectJoin') as \$callable) { call_user_func(\$callable, '{$this->getClassname()}', \$c, \$con); } "; } $script .= " // Set the correct dbName if it has not been overridden if (\$c->getDbName() == Propel::getDefaultDB()) { \$c->setDbName(self::DATABASE_NAME); } ".$this->getPeerClassname()."::addSelectColumns(\$c); \$startcol = (".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS); ".$i18nPeerClassName."::addSelectColumns(\$c); \$c->addJoin(".$pk.", ".$i18nPk."); \$c->add(".$cultureColumnName.", \$culture); \$stmt = ".$this->basePeerClassname."::doSelect(\$c, \$con); \$results = array(); while(\$row = \$stmt->fetch(PDO::FETCH_NUM)) { "; if ($table->getChildrenColumn()) { $script .= " \$omClass = ".$this->getPeerClassname()."::getOMClass(\$row, \$startcol); "; } else { $script .= " \$omClass = ".$this->getPeerClassname()."::getOMClass(); "; } $script .= " \$cls = Propel::importClass(\$omClass); \$obj1 = new \$cls(); \$obj1->hydrate(\$row); \$obj1->setCulture(\$culture); "; if ($i18nTable->getChildrenColumn()) { $script .= " \$omClass = ".$i18nTablePeerBuilder->getPeerClassname()."::getOMClass(\$row, \$startcol); "; } else { $script .= " \$omClass = ".$i18nTablePeerBuilder->getPeerClassname()."::getOMClass(); "; } $script .= " \$cls = Propel::importClass(\$omClass); \$obj2 = new \$cls(); \$obj2->hydrate(\$row, \$startcol); \$obj1->set".$i18nClassName."ForCulture(\$obj2, \$culture); \$obj2->set".$className."(\$obj1); \$results[] = \$obj1; } return \$results; } "; }
/** * Gets the package for the map builder classes. * @return string */ public function getPackage() { return parent::getPackage() . '.map'; }
/** * Gets the package for the [base] object classes. * @return string */ public function getPackage() { return $this->getChild()->getPackage() ? $this->getChild()->getPackage() : parent::getPackage(); }
/** * Constructs a new PeerBuilder subclass. */ public function __construct(Table $table) { parent::__construct($table); $this->basePeerClass = $this->getBasePeer($table); $this->basePeerClassname = $this->classname($this->basePeerClass); }
/** * Adds the doCountJoinAllExcept*() methods. * @param string &$script The script will be modified in this method. */ protected function addDoCountJoinAllExcept(&$script) { $table = $this->getTable(); $fkeys = $table->getForeignKeys(); // this sep assignment is necessary otherwise sub-loops over // getForeignKeys() will cause this to only execute one time. foreach ($fkeys as $fk) { $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); $excludedTable = $table->getDatabase()->getTable($fk->getForeignTableName()); $excludedClassName = $excludedTable->getPhpName(); $thisTableObjectBuilder = OMBuilder::getNewObjectBuilder($table); $excludedTableObjectBuilder = OMBuilder::getNewObjectBuilder($excludedTable); $excludedTablePeerBuilder = OMBuilder::getNewPeerBuilder($excludedTable); $script .= "\n\n\t/**\n\t * Returns the number of rows matching criteria, joining the related " . $thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false) . " table\n\t *\n\t * @param Criteria \$c\n\t * @param boolean \$distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria).\n\t * @param Connection \$con\n\t * @return int Number of matching rows.\n\t */\n\tpublic static function doCountJoinAllExcept" . $thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false) . "(Criteria \$criteria, \$distinct = false, \$con = null)\n\t{\n\t\t// we're going to modify criteria, so copy it first\n\t\t\$criteria = clone \$criteria;\n\n\t\t// clear out anything that might confuse the ORDER BY clause\n\t\t\$criteria->clearSelectColumns()->clearOrderByColumns();\n\t\tif (\$distinct || in_array(Criteria::DISTINCT, \$criteria->getSelectModifiers())) {\n\t\t\t\$criteria->addSelectColumn(" . $this->getPeerClassname() . "::COUNT_DISTINCT);\n\t\t} else {\n\t\t\t\$criteria->addSelectColumn(" . $this->getPeerClassname() . "::COUNT);\n\t\t}\n\n\t\t// just in case we're grouping: add those columns to the select statement\n\t\tforeach(\$criteria->getGroupByColumns() as \$column)\n\t\t{\n\t\t\t\$criteria->addSelectColumn(\$column);\n\t\t}\n"; foreach ($table->getForeignKeys() as $subfk) { // want to cover this case, but the code is not there yet. if ($subfk->getForeignTableName() != $table->getName()) { $joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName()); $joinClassName = $joinTable->getPhpName(); $joinTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable); if ($joinClassName != $excludedClassName) { $lfMap = $subfk->getLocalForeignMapping(); foreach ($subfk->getLocalColumns() as $columnName) { $column = $table->getColumn($columnName); $columnFk = $joinTable->getColumn($lfMap[$columnName]); $script .= "\n\t\t\$criteria->addJoin(" . $this->getColumnConstant($column) . ", " . $joinTablePeerBuilder->getColumnConstant($columnFk) . ");\n"; } } } } // foreach fkeys $script .= "\n\t\t\$rs = " . $this->getPeerClassname() . "::doSelectRS(\$criteria, \$con);\n\t\tif (\$rs->next()) {\n\t\t\treturn \$rs->getInt(1);\n\t\t} else {\n\t\t\t// no rows returned; we infer that means 0 matches.\n\t\t\treturn 0;\n\t\t}\n\t}\n"; } // foreach fk }
/** * Adds the method that returns the referrer fkey collection. * @param string &$script The script will be modified in this method. */ protected function addRefFKGet(&$script, ForeignKey $refFK) { $table = $this->getTable(); $tblFK = $refFK->getTable(); $fkPeerBuilder = OMBuilder::getNewPeerBuilder($refFK->getTable()); $relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true); $collName = $this->getRefFKCollVarName($refFK); $lastCriteriaName = $this->getRefFKLastCriteriaVarName($refFK); $script .= "\n\t/**\n\t * If this collection has already been initialized with\n\t * an identical criteria, it returns the collection.\n\t * Otherwise if this " . $table->getPhpName() . " has previously\n\t * been saved, it will retrieve related {$relCol} from storage.\n\t * If this " . $table->getPhpName() . " is new, it will return\n\t * an empty collection or the current collection, the criteria\n\t * is ignored on a new object.\n\t *\n\t * @param Connection \$con\n\t * @param Criteria \$criteria\n\t * @throws PropelException\n\t */\n\tpublic function get{$relCol}(\$criteria = null, \$con = null)\n\t{\n\t\t// include the Peer class\n\t\tinclude_once '" . $fkPeerBuilder->getClassFilePath() . "';\n\t\tif (\$criteria === null) {\n\t\t\t\$criteria = new Criteria();\n\t\t}\n\t\telseif (\$criteria instanceof Criteria)\n\t\t{\n\t\t\t\$criteria = clone \$criteria;\n\t\t}\n\n\t\tif (\$this->{$collName} === null) {\n\t\t\tif (\$this->isNew()) {\n\t\t\t \$this->{$collName} = array();\n\t\t\t} else {\n"; foreach ($refFK->getLocalColumns() as $colFKName) { // $colFKName is local to the referring table (i.e. foreign to this table) $lfmap = $refFK->getLocalForeignMapping(); $localColumn = $this->getTable()->getColumn($lfmap[$colFKName]); $colFK = $refFK->getTable()->getColumn($colFKName); $script .= "\n\t\t\t\t\$criteria->add(" . $fkPeerBuilder->getColumnConstant($colFK) . ", \$this->get" . $localColumn->getPhpName() . "());\n"; } // end foreach ($fk->getForeignColumns() $script .= "\n\t\t\t\t" . $fkPeerBuilder->getPeerClassname() . "::addSelectColumns(\$criteria);\n\t\t\t\t\$this->{$collName} = " . $fkPeerBuilder->getPeerClassname() . "::doSelect(\$criteria, \$con);\n\t\t\t}\n\t\t} else {\n\t\t\t// criteria has no effect for a new object\n\t\t\tif (!\$this->isNew()) {\n\t\t\t\t// the following code is to determine if a new query is\n\t\t\t\t// called for. If the criteria is the same as the last\n\t\t\t\t// one, just return the collection.\n"; foreach ($refFK->getLocalColumns() as $colFKName) { // $colFKName is local to the referring table (i.e. foreign to this table) $lfmap = $refFK->getLocalForeignMapping(); $localColumn = $this->getTable()->getColumn($lfmap[$colFKName]); $colFK = $refFK->getTable()->getColumn($colFKName); $script .= "\n\n\t\t\t\t\$criteria->add(" . $fkPeerBuilder->getColumnConstant($colFK) . ", \$this->get" . $localColumn->getPhpName() . "());\n"; } // foreach ($fk->getForeignColumns() $script .= "\n\t\t\t\t" . $fkPeerBuilder->getPeerClassname() . "::addSelectColumns(\$criteria);\n\t\t\t\tif (!isset(\$this->{$lastCriteriaName}) || !\$this->" . $lastCriteriaName . "->equals(\$criteria)) {\n\t\t\t\t\t\$this->{$collName} = " . $fkPeerBuilder->getPeerClassname() . "::doSelect(\$criteria, \$con);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\$this->{$lastCriteriaName} = \$criteria;\n\t\treturn \$this->{$collName};\n\t}\n"; }
/** * Checks whether any registered behavior on that table has a modifier for a hook * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" * @return boolean */ public function hasBehaviorModifier($hookName, $modifier = null) { return parent::hasBehaviorModifier($hookName, 'QueryBuilderModifier'); }
/** * Constructs a new PeerBuilder subclass. */ public function __construct(Table $table) { parent::__construct($table); }
/** * Checks whether any registered behavior on that table has a modifier for a hook * @param string $hookName The name of the hook as called from one of this class methods, e.g. "preSave" * @param string &$script The script will be modified in this method. */ public function applyBehaviorModifier($hookName, &$script, $tab = "\t\t") { return parent::applyBehaviorModifier($hookName, 'ObjectBuilderModifier', $script, $tab); }
/** * Adds class attributes. * @param string &$script The script will be modified in this method. */ protected function addAttributes(&$script) { $script .= "\n\t/**\n\t * The Peer class.\n\t * Instance provides a convenient way of calling static methods on a class\n\t * that calling code may not be able to identify.\n\t * @var " . $this->getPeerClassname() . "\n\t */\n\tprotected static \$peer;\n"; if (!$this->getTable()->isAlias()) { $this->addColumnAttributes($script); } $script .= "\n\tprotected \$refCountMethods = array(\n\t\t"; foreach ($this->getTable()->getReferrers() as $refFK) { $relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true); $fkPeerBuilder = OMBuilder::getNewPeerBuilder($refFK->getTable()); $localColumns = $refFK->getLocalColumns(); if (count($localColumns) == 1) { $localColumns = "'" . $localColumns[0] . "'"; } else { $localColumns = var_export($localColumns, true); } $script .= "array('table'=>'" . $refFK->getTable()->getName() . "', 'affix'=>'" . $relCol . "', 'peer'=>'" . $fkPeerBuilder->getPeerClassname() . "', 'column'=>{$localColumns}),\n\t\t"; } $script .= ");\n\tpublic function getRefCountMethods() {\n\t\treturn \$this->refCountMethods;\n\t}"; }