sintonia/library/propel/generator/lib/builder/om/QueryBuilder.php

1066 lines
34 KiB
PHP

<?php
/**
* This file is part of the Propel package.
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @license MIT License
*/
require_once 'builder/om/OMBuilder.php';
/**
* Generates a PHP5 base Query class for user object model (OM).
*
* This class produces the base query class (e.g. BaseBookQuery) which contains all
* the custom-built query methods.
*
* @author Francois Zaninotto
* @package propel.generator.builder.om
*/
class QueryBuilder extends OMBuilder
{
/**
* Gets the package for the [base] object classes.
* @return string
*/
public function getPackage()
{
return parent::getPackage() . ".om";
}
public function getNamespace()
{
if ($namespace = parent::getNamespace()) {
if ($this->getGeneratorConfig() && $omns = $this->getGeneratorConfig()->getBuildProperty('namespaceOm')) {
return $namespace . '\\' . $omns;
} else {
return $namespace;
}
}
}
/**
* Returns the name of the current class being built.
* @return string
*/
public function getUnprefixedClassname()
{
return $this->getBuildProperty('basePrefix') . $this->getStubQueryBuilder()->getUnprefixedClassname();
}
/**
* Adds the include() statements for files that this class depends on or utilizes.
* @param string &$script The script will be modified in this method.
*/
protected function addIncludes(&$script)
{
}
/**
* Adds class phpdoc comment and openning of class.
* @param string &$script The script will be modified in this method.
*/
protected function addClassOpen(&$script)
{
$table = $this->getTable();
$tableName = $table->getName();
$tableDesc = $table->getDescription();
$queryClass = $this->getStubQueryBuilder()->getClassname();
$modelClass = $this->getStubObjectBuilder()->getClassname();
$parentClass = $this->getBehaviorContent('parentClass');
$parentClass = null === $parentClass ? 'ModelCriteria' : $parentClass;
$script .= "
/**
* Base class that represents a query for the '$tableName' table.
*
* $tableDesc
*";
if ($this->getBuildProperty('addTimeStamp')) {
$now = strftime('%c');
$script .= "
* This class was autogenerated by Propel " . $this->getBuildProperty('version') . " on:
*
* $now
*";
}
// magic orderBy() methods, for IDE completion
foreach ($this->getTable()->getColumns() as $column) {
$script .= "
* @method $queryClass orderBy" . $column->getPhpName() . "(\$order = Criteria::ASC) Order by the " . $column->getName() . " column";
}
$script .= "
*";
// magic groupBy() methods, for IDE completion
foreach ($this->getTable()->getColumns() as $column) {
$script .= "
* @method $queryClass groupBy" . $column->getPhpName() . "() Group by the " . $column->getName() . " column";
}
// override the signature of ModelCriteria::left-, right- and innerJoin to specify the class of the returned object, for IDE completion
$script .= "
*
* @method $queryClass leftJoin(\$relation) Adds a LEFT JOIN clause to the query
* @method $queryClass rightJoin(\$relation) Adds a RIGHT JOIN clause to the query
* @method $queryClass innerJoin(\$relation) Adds a INNER JOIN clause to the query
*";
// magic XXXjoinYYY() methods, for IDE completion
foreach ($this->getTable()->getForeignKeys() as $fk) {
$relationName = $this->getFKPhpNameAffix($fk);
$script .= "
* @method $queryClass leftJoin" . $relationName . "(\$relationAlias = '') Adds a LEFT JOIN clause to the query using the " . $relationName . " relation
* @method $queryClass rightJoin" . $relationName . "(\$relationAlias = '') Adds a RIGHT JOIN clause to the query using the " . $relationName . " relation
* @method $queryClass innerJoin" . $relationName . "(\$relationAlias = '') Adds a INNER JOIN clause to the query using the " . $relationName . " relation
*";
}
foreach ($this->getTable()->getReferrers() as $refFK) {
$relationName = $this->getRefFKPhpNameAffix($refFK);
$script .= "
* @method $queryClass leftJoin" . $relationName . "(\$relationAlias = '') Adds a LEFT JOIN clause to the query using the " . $relationName . " relation
* @method $queryClass rightJoin" . $relationName . "(\$relationAlias = '') Adds a RIGHT JOIN clause to the query using the " . $relationName . " relation
* @method $queryClass innerJoin" . $relationName . "(\$relationAlias = '') Adds a INNER JOIN clause to the query using the " . $relationName . " relation
*";
}
// override the signature of ModelCriteria::findOne() to specify the class of the returned object, for IDE completion
$script .= "
* @method $modelClass findOne(PropelPDO \$con = null) Return the first $modelClass matching the query
* @method $modelClass findOneOrCreate(PropelPDO \$con = null) Return the first $modelClass matching the query, or a new $modelClass object populated from the query conditions when no match is found
*";
// magic findBy() methods, for IDE completion
foreach ($this->getTable()->getColumns() as $column) {
$script .= "
* @method $modelClass findOneBy" . $column->getPhpName() . "(" . $column->getPhpType() . " \$" . $column->getName() . ") Return the first $modelClass filtered by the " . $column->getName() . " column";
}
$script .= "
*";
foreach ($this->getTable()->getColumns() as $column) {
$script .= "
* @method array findBy" . $column->getPhpName() . "(" . $column->getPhpType() . " \$" . $column->getName() . ") Return $modelClass objects filtered by the " . $column->getName() . " column";
}
$script .= "
*
* @package propel.generator.".$this->getPackage()."
*/
abstract class ".$this->getClassname()." extends " . $parentClass . "
{
";
}
/**
* Specifies the methods that are added as part of the stub object class.
*
* By default there are no methods for the empty stub classes; override this method
* if you want to change that behavior.
*
* @see ObjectBuilder::addClassBody()
*/
protected function addClassBody(&$script)
{
// namespaces
$this->declareClasses('ModelCriteria', 'Criteria', 'ModelJoin');
$this->declareClassFromBuilder($this->getStubQueryBuilder());
$this->declareClassFromBuilder($this->getStubPeerBuilder());
// apply behaviors
$this->applyBehaviorModifier('queryAttributes', $script, " ");
$this->addConstructor($script);
$this->addFactory($script);
$this->addFindPk($script);
$this->addFindPks($script);
$this->addFilterByPrimaryKey($script);
$this->addFilterByPrimaryKeys($script);
foreach ($this->getTable()->getColumns() as $col) {
$this->addFilterByCol($script, $col);
}
foreach ($this->getTable()->getForeignKeys() as $fk) {
$this->addFilterByFK($script, $fk);
$this->addJoinFk($script, $fk);
$this->addUseFKQuery($script, $fk);
}
foreach ($this->getTable()->getReferrers() as $refFK) {
$this->addFilterByRefFK($script, $refFK);
$this->addJoinRefFk($script, $refFK);
$this->addUseRefFKQuery($script, $refFK);
}
foreach ($this->getTable()->getCrossFks() as $fkList) {
list($refFK, $crossFK) = $fkList;
$this->addFilterByCrossFK($script, $refFK, $crossFK);
}
$this->addPrune($script);
$this->addBasePreSelect($script);
$this->addBasePreDelete($script);
$this->addBasePostDelete($script);
$this->addBasePreUpdate($script);
$this->addBasePostUpdate($script);
// apply behaviors
$this->applyBehaviorModifier('queryMethods', $script, " ");
}
/**
* Closes class.
* @param string &$script The script will be modified in this method.
*/
protected function addClassClose(&$script)
{
$script .= "
} // " . $this->getClassname() . "
";
$this->applyBehaviorModifier('queryFilter', $script, "");
}
/**
* Adds the constructor for this object.
* @param string &$script The script will be modified in this method.
* @see addConstructor()
*/
protected function addConstructor(&$script)
{
$this->addConstructorComment($script);
$this->addConstructorOpen($script);
$this->addConstructorBody($script);
$this->addConstructorClose($script);
}
/**
* Adds the comment for the constructor
* @param string &$script The script will be modified in this method.
**/
protected function addConstructorComment(&$script)
{
$script .= "
/**
* Initializes internal state of ".$this->getClassname()." object.
*
* @param string \$dbName The dabase name
* @param string \$modelName The phpName of a model, e.g. 'Book'
* @param string \$modelAlias The alias for the model in this query, e.g. 'b'
*/";
}
/**
* Adds the function declaration for the constructor
* @param string &$script The script will be modified in this method.
**/
protected function addConstructorOpen(&$script)
{
$table = $this->getTable();
$script .= "
public function __construct(\$dbName = '" . $table->getDatabase()->getName() . "', \$modelName = '" . addslashes($this->getNewStubObjectBuilder($table)->getFullyQualifiedClassname()) . "', \$modelAlias = null)
{";
}
/**
* Adds the function body for the constructor
* @param string &$script The script will be modified in this method.
**/
protected function addConstructorBody(&$script)
{
$script .= "
parent::__construct(\$dbName, \$modelName, \$modelAlias);";
}
/**
* Adds the function close for the constructor
* @param string &$script The script will be modified in this method.
**/
protected function addConstructorClose(&$script)
{
$script .= "
}
";
}
/**
* Adds the factory for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addFactory(&$script)
{
$this->addFactoryComment($script);
$this->addFactoryOpen($script);
$this->addFactoryBody($script);
$this->addFactoryClose($script);
}
/**
* Adds the comment for the factory
* @param string &$script The script will be modified in this method.
**/
protected function addFactoryComment(&$script)
{
$classname = $this->getNewStubQueryBuilder($this->getTable())->getClassname();
$script .= "
/**
* Returns a new " . $classname . " object.
*
* @param string \$modelAlias The alias of a model in the query
* @param Criteria \$criteria Optional Criteria to build the query from
*
* @return " . $classname . "
*/";
}
/**
* Adds the function declaration for the factory
* @param string &$script The script will be modified in this method.
**/
protected function addFactoryOpen(&$script)
{
$script .= "
public static function create(\$modelAlias = null, \$criteria = null)
{";
}
/**
* Adds the function body for the factory
* @param string &$script The script will be modified in this method.
**/
protected function addFactoryBody(&$script)
{
$classname = $this->getNewStubQueryBuilder($this->getTable())->getClassname();
$script .= "
if (\$criteria instanceof " . $classname . ") {
return \$criteria;
}
\$query = new " . $classname . "();
if (null !== \$modelAlias) {
\$query->setModelAlias(\$modelAlias);
}
if (\$criteria instanceof Criteria) {
\$query->mergeWith(\$criteria);
}
return \$query;";
}
/**
* Adds the function close for the factory
* @param string &$script The script will be modified in this method.
**/
protected function addFactoryClose(&$script)
{
$script .= "
}
";
}
/**
* Adds the findPk method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addFindPk(&$script)
{
$table = $this->getTable();
$pks = $table->getPrimaryKey();
$class = $class = $this->getStubObjectBuilder()->getClassname();
$script .= "
/**
* Find object by primary key";
if (count($pks) === 1) {
$pkType = 'mixed';
$script .= "
* Use instance pooling to avoid a database query if the object exists
* <code>
* \$obj = \$c->findPk(12, \$con);";
} else {
$examplePk = array_slice(array(12, 34, 56, 78, 91), 0, count($pks));
$colNames = array();
foreach ($pks as $col) {
$colNames[]= '$' . $col->getName();
}
$pkType = 'array['. join($colNames, ', ') . ']';
$script .= "
* <code>
* \$obj = \$c->findPk(array(" . join($examplePk, ', ') . "), \$con);";
}
$script .= "
* </code>
* @param " . $pkType . " \$key Primary key to use for the query
* @param PropelPDO \$con an optional connection object
*
* @return " . $class . "|array|mixed the result, formatted by the current formatter
*/
public function findPk(\$key, \$con = null)
{";
if (count($pks) === 1) {
$poolKeyHashParams = '$key';
} else {
$poolKeyHashParams = array();
for ($i = 0, $count = count($pks); $i < $count; $i++) {
$poolKeyHashParams[]= '$key[' . $i . ']';
}
}
// tip: we don't use findOne() to avoid putting an unecessary LIMIT 1 statement,
// which may be costly on platforms not natively supporting LIMIT (like Oracle)
$script .= "
if ((null !== (\$obj = ".$this->getPeerClassname()."::getInstanceFromPool(".$this->getPeerBuilder()->getInstancePoolKeySnippet($poolKeyHashParams)."))) && \$this->getFormatter()->isObjectFormatter()) {
// the object is alredy in the instance pool
return \$obj;
} else {
// the object has not been requested yet, or the formatter is not an object formatter
\$criteria = \$this->isKeepQuery() ? clone \$this : \$this;
\$stmt = \$criteria
->filterByPrimaryKey(\$key)
->getSelectStatement(\$con);
return \$criteria->getFormatter()->init(\$criteria)->formatOne(\$stmt);
}
}
";
}
/**
* Adds the findPks method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addFindPks(&$script)
{
$table = $this->getTable();
$pks = $table->getPrimaryKey();
$count = count($pks);
$script .= "
/**
* Find objects by primary key
* <code>";
if ($count === 1) {
$script .= "
* \$objs = \$c->findPks(array(12, 56, 832), \$con);";
} else {
$script .= "
* \$objs = \$c->findPks(array(array(12, 56), array(832, 123), array(123, 456)), \$con);";
}
$script .= "
* </code>
* @param array \$keys Primary keys to use for the query
* @param PropelPDO \$con an optional connection object
*
* @return PropelObjectCollection|array|mixed the list of results, formatted by the current formatter
*/
public function findPks(\$keys, \$con = null)
{
\$criteria = \$this->isKeepQuery() ? clone \$this : \$this;
return \$this
->filterByPrimaryKeys(\$keys)
->find(\$con);
}
";
}
/**
* Adds the filterByPrimaryKey method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addFilterByPrimaryKey(&$script)
{
$script .= "
/**
* Filter the query by primary key
*
* @param mixed \$key Primary key to use for the query
*
* @return " . $this->getStubQueryBuilder()->getClassname() . " The current query, for fluid interface
*/
public function filterByPrimaryKey(\$key)
{";
$table = $this->getTable();
$pks = $table->getPrimaryKey();
if (count($pks) === 1) {
// simple primary key
$col = $pks[0];
$const = $this->getColumnConstant($col);
$script .= "
return \$this->addUsingAlias($const, \$key, Criteria::EQUAL);";
} else {
// composite primary key
$i = 0;
foreach ($pks as $col) {
$const = $this->getColumnConstant($col);
$script .= "
\$this->addUsingAlias($const, \$key[$i], Criteria::EQUAL);";
$i++;
}
$script .= "
return \$this;";
}
$script .= "
}
";
}
/**
* Adds the filterByPrimaryKey method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addFilterByPrimaryKeys(&$script)
{
$script .= "
/**
* Filter the query by a list of primary keys
*
* @param array \$keys The list of primary key to use for the query
*
* @return " . $this->getStubQueryBuilder()->getClassname() . " The current query, for fluid interface
*/
public function filterByPrimaryKeys(\$keys)
{";
$table = $this->getTable();
$pks = $table->getPrimaryKey();
if (count($pks) === 1) {
// simple primary key
$col = $pks[0];
$const = $this->getColumnConstant($col);
$script .= "
return \$this->addUsingAlias($const, \$keys, Criteria::IN);";
} else {
// composite primary key
$script .= "
foreach (\$keys as \$key) {";
$i = 0;
foreach ($pks as $col) {
$const = $this->getColumnConstant($col);
$script .= "
\$cton$i = \$this->getNewCriterion($const, \$key[$i], Criteria::EQUAL);";
if ($i>0) {
$script .= "
\$cton0->addAnd(\$cton$i);";
}
$i++;
}
$script .= "
\$this->addOr(\$cton0);
}";
$script .= "
return \$this;";
}
$script .= "
}
";
}
/**
* Adds the filterByCol method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addFilterByCol(&$script, $col)
{
$colPhpName = $col->getPhpName();
$colName = $col->getName();
$variableName = $col->getStudlyPhpName();
$qualifiedName = $this->getColumnConstant($col);
$script .= "
/**
* Filter the query on the $colName column
* ";
if ($col->isNumericType() || $col->isTemporalType()) {
$script .= "
* @param " . $col->getPhpType() . "|array \$$variableName The value to use as filter.
* Accepts an associative array('min' => \$minValue, 'max' => \$maxValue)";
} elseif ($col->isTextType()) {
$script .= "
* @param string \$$variableName The value to use as filter.
* Accepts wildcards (* and % trigger a LIKE)";
} elseif ($col->isBooleanType()) {
$script .= "
* @param boolean|string \$$variableName The value to use as filter.
* Accepts strings ('false', 'off', '-', 'no', 'n', and '0' are false, the rest is true)";
} else {
$script .= "
* @param mixed \$$variableName The value to use as filter";
}
$script .= "
* @param string \$comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return " . $this->getStubQueryBuilder()->getClassname() . " The current query, for fluid interface
*/
public function filterBy$colPhpName(\$$variableName = null, \$comparison = null)
{";
if ($col->isPrimaryKey() && ($col->getType() == PropelTypes::INTEGER || $col->getType() == PropelTypes::BIGINT)) {
$script .= "
if (is_array(\$$variableName) && null === \$comparison) {
\$comparison = Criteria::IN;
}";
} elseif ($col->isNumericType() || $col->isTemporalType()) {
$script .= "
if (is_array(\$$variableName)) {
\$useMinMax = false;
if (isset(\${$variableName}['min'])) {
\$this->addUsingAlias($qualifiedName, \${$variableName}['min'], Criteria::GREATER_EQUAL);
\$useMinMax = true;
}
if (isset(\${$variableName}['max'])) {
\$this->addUsingAlias($qualifiedName, \${$variableName}['max'], Criteria::LESS_EQUAL);
\$useMinMax = true;
}
if (\$useMinMax) {
return \$this;
}
if (null === \$comparison) {
\$comparison = Criteria::IN;
}
}";
} elseif ($col->isTextType()) {
$script .= "
if (null === \$comparison) {
if (is_array(\$$variableName)) {
\$comparison = Criteria::IN;
} elseif (preg_match('/[\%\*]/', \$$variableName)) {
\$$variableName = str_replace('*', '%', \$$variableName);
\$comparison = Criteria::LIKE;
}
}";
} elseif ($col->isBooleanType()) {
$script .= "
if (is_string(\$$variableName)) {
\$$colName = in_array(strtolower(\$$variableName), array('false', 'off', '-', 'no', 'n', '0')) ? false : true;
}";
}
$script .= "
return \$this->addUsingAlias($qualifiedName, \$$variableName, \$comparison);
}
";
}
/**
* Adds the filterByFk method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addFilterByFk(&$script, $fk)
{
$table = $this->getTable();
$queryClass = $this->getStubQueryBuilder()->getClassname();
$fkTable = $this->getForeignTable($fk);
$fkPhpName = $this->getNewStubObjectBuilder($fkTable)->getClassname();
$relationName = $this->getFKPhpNameAffix($fk);
$objectName = '$' . $fkTable->getStudlyPhpName();
$script .= "
/**
* Filter the query by a related $fkPhpName object
*
* @param $fkPhpName $objectName the related object to use as filter
* @param string \$comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return $queryClass The current query, for fluid interface
*/
public function filterBy$relationName($objectName, \$comparison = null)
{
return \$this";
foreach ($fk->getLocalForeignMapping() as $localColumn => $foreignColumn) {
$localColumnObject = $table->getColumn($localColumn);
$foreignColumnObject = $fkTable->getColumn($foreignColumn);
$script .= "
->addUsingAlias(" . $this->getColumnConstant($localColumnObject) . ", " . $objectName . "->get" . $foreignColumnObject->getPhpName() . "(), \$comparison)";
}
$script .= ";
}
";
}
/**
* Adds the filterByRefFk method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addFilterByRefFk(&$script, $fk)
{
$table = $this->getTable();
$queryClass = $this->getStubQueryBuilder()->getClassname();
$fkTable = $this->getTable()->getDatabase()->getTable($fk->getTableName());
$fkPhpName = $this->getNewStubObjectBuilder($fkTable)->getClassname();
$relationName = $this->getRefFKPhpNameAffix($fk);
$objectName = '$' . $fkTable->getStudlyPhpName();
$script .= "
/**
* Filter the query by a related $fkPhpName object
*
* @param $fkPhpName $objectName the related object to use as filter
* @param string \$comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return $queryClass The current query, for fluid interface
*/
public function filterBy$relationName($objectName, \$comparison = null)
{
return \$this";
foreach ($fk->getForeignLocalMapping() as $localColumn => $foreignColumn) {
$localColumnObject = $table->getColumn($localColumn);
$foreignColumnObject = $fkTable->getColumn($foreignColumn);
$script .= "
->addUsingAlias(" . $this->getColumnConstant($localColumnObject) . ", " . $objectName . "->get" . $foreignColumnObject->getPhpName() . "(), \$comparison)";
}
$script .= ";
}
";
}
/**
* Adds the joinFk method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addJoinFk(&$script, $fk)
{
$table = $this->getTable();
$queryClass = $this->getStubQueryBuilder()->getClassname();
$fkTable = $this->getForeignTable($fk);
$relationName = $this->getFKPhpNameAffix($fk);
$joinType = $this->getJoinType($fk);
$this->addJoinRelated($script, $fkTable, $queryClass, $relationName, $joinType);
}
/**
* Adds the joinRefFk method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addJoinRefFk(&$script, $fk)
{
$table = $this->getTable();
$queryClass = $this->getStubQueryBuilder()->getClassname();
$fkTable = $this->getTable()->getDatabase()->getTable($fk->getTableName());
$relationName = $this->getRefFKPhpNameAffix($fk);
$joinType = $this->getJoinType($fk);
$this->addJoinRelated($script, $fkTable, $queryClass, $relationName, $joinType);
}
/**
* Adds a joinRelated method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addJoinRelated(&$script, $fkTable, $queryClass, $relationName, $joinType)
{
$script .= "
/**
* Adds a JOIN clause to the query using the " . $relationName . " relation
*
* @param string \$relationAlias optional alias for the relation
* @param string \$joinType Accepted values are null, 'left join', 'right join', 'inner join'
*
* @return ". $queryClass . " The current query, for fluid interface
*/
public function join" . $relationName . "(\$relationAlias = '', \$joinType = " . $joinType . ")
{
\$tableMap = \$this->getTableMap();
\$relationMap = \$tableMap->getRelation('" . $relationName . "');
// create a ModelJoin object for this join
\$join = new ModelJoin();
\$join->setJoinType(\$joinType);
\$join->setRelationMap(\$relationMap, \$this->useAliasInSQL ? \$this->getModelAlias() : null, \$relationAlias);
if (\$previousJoin = \$this->getPreviousJoin()) {
\$join->setPreviousJoin(\$previousJoin);
}
// add the ModelJoin to the current object
if(\$relationAlias) {
\$this->addAlias(\$relationAlias, \$relationMap->getRightTable()->getName());
\$this->addJoinObject(\$join, \$relationAlias);
} else {
\$this->addJoinObject(\$join, '" . $relationName . "');
}
return \$this;
}
";
}
/**
* Adds the useFkQuery method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addUseFkQuery(&$script, $fk)
{
$table = $this->getTable();
$fkTable = $this->getForeignTable($fk);
$queryClass = $this->getNewStubQueryBuilder($fkTable)->getClassname();
$relationName = $this->getFKPhpNameAffix($fk);
$joinType = $this->getJoinType($fk);
$this->addUseRelatedQuery($script, $fkTable, $queryClass, $relationName, $joinType);
}
/**
* Adds the useFkQuery method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addUseRefFkQuery(&$script, $fk)
{
$table = $this->getTable();
$fkTable = $this->getTable()->getDatabase()->getTable($fk->getTableName());
$queryClass = $this->getNewStubQueryBuilder($fkTable)->getClassname();
$relationName = $this->getRefFKPhpNameAffix($fk);
$joinType = $this->getJoinType($fk);
$this->addUseRelatedQuery($script, $fkTable, $queryClass, $relationName, $joinType);
}
/**
* Adds a useRelatedQuery method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addUseRelatedQuery(&$script, $fkTable, $queryClass, $relationName, $joinType)
{
$script .= "
/**
* Use the $relationName relation " . $fkTable->getPhpName() . " object
*
* @see useQuery()
*
* @param string \$relationAlias optional alias for the relation,
* to be used as main alias in the secondary query
* @param string \$joinType Accepted values are null, 'left join', 'right join', 'inner join'
*
* @return $queryClass A secondary query class using the current class as primary query
*/
public function use" . $relationName . "Query(\$relationAlias = '', \$joinType = " . $joinType . ")
{
return \$this
->join" . $relationName . "(\$relationAlias, \$joinType)
->useQuery(\$relationAlias ? \$relationAlias : '$relationName', '$queryClass');
}
";
}
protected function addFilterByCrossFK(&$script, $refFK, $crossFK)
{
$queryClass = $this->getStubQueryBuilder()->getClassname();
$crossRefTable = $crossFK->getTable();
$foreignTable = $crossFK->getForeignTable();
$fkPhpName = $foreignTable->getPhpName();
$crossTableName = $crossRefTable->getName();
$relName = $this->getFKPhpNameAffix($crossFK, $plural = false);
$objectName = '$' . $foreignTable->getStudlyPhpName();
$relationName = $this->getRefFKPhpNameAffix($refFK, $plural = false);
$script .= "
/**
* Filter the query by a related $fkPhpName object
* using the $crossTableName table as cross reference
*
* @param $fkPhpName $objectName the related object to use as filter
* @param string \$comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return $queryClass The current query, for fluid interface
*/
public function filterBy{$relName}($objectName, \$comparison = Criteria::EQUAL)
{
return \$this
->use{$relationName}Query()
->filterBy{$relName}($objectName, \$comparison)
->endUse();
}
";
}
/**
* Adds the prune method for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addPrune(&$script)
{
$table = $this->getTable();
$class = $this->getStubObjectBuilder()->getClassname();
$objectName = '$' . $table->getStudlyPhpName();
$script .= "
/**
* Exclude object from result
*
* @param $class $objectName Object to remove from the list of results
*
* @return " . $this->getStubQueryBuilder()->getClassname() . " The current query, for fluid interface
*/
public function prune($objectName = null)
{
if ($objectName) {";
$pks = $table->getPrimaryKey();
if (count($pks) > 1) {
$i = 0;
$conditions = array();
foreach ($pks as $col) {
$const = $this->getColumnConstant($col);
$condName = "'pruneCond" . $i . "'";
$conditions[]= $condName;
$script .= "
\$this->addCond(". $condName . ", \$this->getAliasedColName($const), " . $objectName . "->get" . $col->getPhpName() . "(), Criteria::NOT_EQUAL);";
$i++;
}
$conditionsString = implode(', ', $conditions);
$script .= "
\$this->combine(array(" . $conditionsString . "), Criteria::LOGICAL_OR);";
} else {
$col = $pks[0];
$const = $this->getColumnConstant($col);
$script .= "
\$this->addUsingAlias($const, " . $objectName . "->get" . $col->getPhpName() . "(), Criteria::NOT_EQUAL);";
}
$script .= "
}
return \$this;
}
";
}
/**
* Adds the basePreSelect hook for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addBasePreSelect(&$script)
{
$behaviorCode = '';
$this->applyBehaviorModifier('preSelectQuery', $behaviorCode, " ");
if (!$behaviorCode) {
return;
}
$script .= "
/**
* Code to execute before every SELECT statement
*
* @param PropelPDO \$con The connection object used by the query
*/
protected function basePreSelect(PropelPDO \$con)
{" . $behaviorCode . "
return \$this->preSelect(\$con);
}
";
}
/**
* Adds the basePreDelete hook for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addBasePreDelete(&$script)
{
$behaviorCode = '';
$this->applyBehaviorModifier('preDeleteQuery', $behaviorCode, " ");
if (!$behaviorCode) {
return;
}
$script .= "
/**
* Code to execute before every DELETE statement
*
* @param PropelPDO \$con The connection object used by the query
*/
protected function basePreDelete(PropelPDO \$con)
{" . $behaviorCode . "
return \$this->preDelete(\$con);
}
";
}
/**
* Adds the basePostDelete hook for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addBasePostDelete(&$script)
{
$behaviorCode = '';
$this->applyBehaviorModifier('postDeleteQuery', $behaviorCode, " ");
if (!$behaviorCode) {
return;
}
$script .= "
/**
* Code to execute after every DELETE statement
*
* @param int \$affectedRows the number of deleted rows
* @param PropelPDO \$con The connection object used by the query
*/
protected function basePostDelete(\$affectedRows, PropelPDO \$con)
{" . $behaviorCode . "
return \$this->postDelete(\$affectedRows, \$con);
}
";
}
/**
* Adds the basePreUpdate hook for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addBasePreUpdate(&$script)
{
$behaviorCode = '';
$this->applyBehaviorModifier('preUpdateQuery', $behaviorCode, " ");
if (!$behaviorCode) {
return;
}
$script .= "
/**
* Code to execute before every UPDATE statement
*
* @param array \$values The associatiove array of columns and values for the update
* @param PropelPDO \$con The connection object used by the query
* @param boolean \$forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), ortherwise it is a series of save() calls on all the found objects
*/
protected function basePreUpdate(&\$values, PropelPDO \$con, \$forceIndividualSaves = false)
{" . $behaviorCode . "
return \$this->preUpdate(\$values, \$con, \$forceIndividualSaves);
}
";
}
/**
* Adds the basePostUpdate hook for this object.
* @param string &$script The script will be modified in this method.
*/
protected function addBasePostUpdate(&$script)
{
$behaviorCode = '';
$this->applyBehaviorModifier('postUpdateQuery', $behaviorCode, " ");
if (!$behaviorCode) {
return;
}
$script .= "
/**
* Code to execute after every UPDATE statement
*
* @param int \$affectedRows the number of udated rows
* @param PropelPDO \$con The connection object used by the query
*/
protected function basePostUpdate(\$affectedRows, PropelPDO \$con)
{" . $behaviorCode . "
return \$this->postUpdate(\$affectedRows, \$con);
}
";
}
/**
* 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');
}
/**
* 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 $this->applyBehaviorModifierBase($hookName, 'QueryBuilderModifier', $script, $tab);
}
/**
* Checks whether any registered behavior content creator on that table exists a contentName
* @param string $contentName The name of the content as called from one of this class methods, e.g. "parentClassname"
*/
public function getBehaviorContent($contentName)
{
return $this->getBehaviorContentBase($contentName, 'QueryBuilderModifier');
}
}