/** * Ensures uniqueness of select column names by turning them all into aliases * This is necessary for queries on more than one table when the tables share a column name * Moved from BasePeer to PdoAdapter and turned from static to non static * * @see http://propel.phpdb.org/trac/ticket/795 * * @param Propel\Runtime\Query\Criteria $criteria * @return Propel\Runtime\Query\Criteria The input, with Select columns replaced by aliases */ public function turnSelectColumnsToAliases(Criteria $criteria) { $selectColumns = $criteria->getSelectColumns(); // clearSelectColumns also clears the aliases, so get them too $asColumns = $criteria->getAsColumns(); $criteria->clearSelectColumns(); $columnAliases = $asColumns; // add the select columns back foreach ($selectColumns as $clause) { // Generate a unique alias $baseAlias = preg_replace('/\\W/', '_', $clause); $alias = $baseAlias; // If it already exists, add a unique suffix $i = 0; while (isset($columnAliases[$alias])) { $i++; $alias = $baseAlias . '_' . $i; } // Add it as an alias $criteria->addAsColumn($alias, $clause); $columnAliases[$alias] = $clause; } // Add the aliases back, don't modify them foreach ($asColumns as $name => $clause) { $criteria->addAsColumn($name, $clause); } return $criteria; }
/** * Test the Criteria::addJoinMultiple() method with join type and operator * * @link http://propel.phpdb.org/trac/ticket/606 */ public function testAddJoinMultipleWithJoinTypeAndOperator() { $c = new Criteria(); $c->clearSelectColumns()->addMultipleJoin(array(array('TABLE_A.FOO_ID', 'TABLE_B.ID', Criteria::GREATER_EQUAL), array('TABLE_A.BAR', 'TABLE_B.BAZ', Criteria::LESS_THAN)), Criteria::LEFT_JOIN)->addSelectColumn("TABLE_A.ID"); $expect = 'SELECT TABLE_A.ID FROM TABLE_A ' . 'LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID>=TABLE_B.ID AND TABLE_A.BAR<TABLE_B.BAZ)'; $params = array(); $result = BasePeer::createSelectSql($c, $params); $this->assertEquals($expect, $result); }