1
0
mirror of synced 2025-01-20 07:21:40 +03:00

fixed the handling of aliases within DQL DELETE and UPDATE queries

This commit is contained in:
zYne 2007-03-01 21:48:09 +00:00
parent 9b525f348b
commit 1dfbc5b007
7 changed files with 89 additions and 46 deletions

View File

@ -34,6 +34,30 @@ Doctrine::autoload('Doctrine_Access');
*/
abstract class Doctrine_Hydrate extends Doctrine_Access
{
/**
* QUERY TYPE CONSTANTS
*/
/**
* constant for SELECT queries
*/
const SELECT = 0;
/**
* constant for DELETE queries
*/
const DELETE = 1;
/**
* constant for UPDATE queries
*/
const UPDATE = 2;
/**
* constant for INSERT queries
*/
const INSERT = 3;
/**
* constant for CREATE queries
*/
const CREATE = 4;
/**
* @var array $fetchmodes an array containing all fetchmodes
*/
@ -109,6 +133,12 @@ abstract class Doctrine_Hydrate extends Doctrine_Access
'limit' => false,
'offset' => false,
);
/**
* @var integer $type the query type
*
* @see Doctrine_Query::* constants
*/
protected $type = self::SELECT;
/**
* constructor
*
@ -605,6 +635,24 @@ abstract class Doctrine_Hydrate extends Doctrine_Access
}
return false;
}
/**
* getType
*
* returns the type of this query object
* by default the type is Doctrine_Hydrate::SELECT but if update() or delete()
* are being called the type is Doctrine_Hydrate::UPDATE and Doctrine_Hydrate::DELETE,
* respectively
*
* @see Doctrine_Hydrate::SELECT
* @see Doctrine_Hydrate::UPDATE
* @see Doctrine_Hydrate::DELETE
*
* @return integer return the query type
*/
public function getType()
{
return $this->type;
}
/**
* applyInheritance
* applies column aggregation inheritance to DQL / SQL query
@ -627,14 +675,22 @@ abstract class Doctrine_Hydrate extends Doctrine_Access
$index = 0;
foreach ($array as $tableAlias => $maps) {
$a = array();
// don't use table aliases if the query isn't a select query
if ($this->type !== Doctrine_Query::SELECT) {
$tableAlias = '';
} else {
$tableAlias .= '.';
}
foreach ($maps as $map) {
$b = array();
foreach ($map as $field => $value) {
if ($index > 0) {
$b[] = '(' . $tableAlias . '.' . $field . ' = ' . $value
. ' OR ' . $tableAlias . '.' . $field . ' IS NULL)';
$b[] = '(' . $tableAlias . $field . ' = ' . $value
. ' OR ' . $tableAlias . $field . ' IS NULL)';
} else {
$b[] = $tableAlias . '.' . $field . ' = ' . $value;
$b[] = $tableAlias . $field . ' = ' . $value;
}
}

View File

@ -31,30 +31,6 @@ Doctrine::autoload('Doctrine_Hydrate');
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
*/
class Doctrine_Query extends Doctrine_Hydrate implements Countable {
/**
* QUERY TYPE CONSTANTS
*/
/**
* constant for SELECT queries
*/
const SELECT = 0;
/**
* constant for DELETE queries
*/
const DELETE = 1;
/**
* constant for UPDATE queries
*/
const UPDATE = 2;
/**
* constant for INSERT queries
*/
const INSERT = 3;
/**
* constant for CREATE queries
*/
const CREATE = 4;
/**
* @param array $subqueryAliases the table aliases needed in some LIMIT subqueries
*/
@ -87,12 +63,7 @@ class Doctrine_Query extends Doctrine_Hydrate implements Countable {
*/
private $pendingFields = array();
/**
* @var integer $type the query type
*
* @see Doctrine_Query::* constants
*/
protected $type = self::SELECT;
/**
* create
@ -126,6 +97,7 @@ class Doctrine_Query extends Doctrine_Hydrate implements Countable {
$this->isSubquery = (bool) $bool;
return $this;
}
/**
* getAggregateAlias
*

View File

@ -46,9 +46,9 @@ class Doctrine_Query_Set extends Doctrine_Query_Part
$reference = implode('.', $e);
$alias = $this->query->getTableAlias($reference);
$table = $this->query->getTable($alias);
$fieldname = $alias ? $alias . '.' . $field : $field;
$result[] = $fieldname . ' = ' . $set[1];
$result[] = $table->getColumnName($field) . ' = ' . $set[1];
}
return implode(', ', $result);

View File

@ -132,7 +132,7 @@ class Doctrine_Query_Where extends Doctrine_Query_Condition
$trimmed = Doctrine_Query::bracketTrim($value);
if (substr($trimmed, 0, 4) == 'FROM' || substr($trimmed, 0, 6) == 'SELECT') {
// subquery found
$q = new Doctrine_Query();
$value = '(' . $q->isSubquery(true)->parseQuery($trimmed)->getQuery() . ')';
@ -171,7 +171,13 @@ class Doctrine_Query_Where extends Doctrine_Query_Condition
$value = $enumIndex;
}
default:
$fieldname = $alias ? $alias . '.' . $field : $field;
if ($this->query->getType() === Doctrine_Query::SELECT) {
$fieldname = $alias ? $alias . '.' . $field : $field;
} else {
$fieldname = $field;
}
$where = $fieldname . ' '
. $operator . ' ' . $value;
}

View File

@ -5,13 +5,13 @@ class Doctrine_Query_Delete_TestCase extends Doctrine_UnitTestCase {
$q->parseQuery('DELETE FROM User');
$this->assertEqual($q->getQuery(), 'DELETE FROM entity WHERE (e.type = 0)');
$this->assertEqual($q->getQuery(), 'DELETE FROM entity WHERE (type = 0)');
$q = new Doctrine_Query();
$q->delete()->from('User');
$this->assertEqual($q->getQuery(), 'DELETE FROM entity WHERE (e.type = 0)');
$this->assertEqual($q->getQuery(), 'DELETE FROM entity WHERE (type = 0)');
}
public function testDeleteAll() {
$q = new Doctrine_Query();

View File

@ -5,26 +5,33 @@ class Doctrine_Query_Update_TestCase extends Doctrine_UnitTestCase {
$q->parseQuery("UPDATE User u SET u.name = 'someone'");
$this->assertEqual($q->getQuery(), "UPDATE entity e SET e.name = 'someone' WHERE (e.type = 0)");
$this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone' WHERE (type = 0)");
$q = new Doctrine_Query();
$q->update('User u')->set('u.name', "'someone'");
$this->assertEqual($q->getQuery(), "UPDATE entity e SET e.name = 'someone' WHERE (e.type = 0)");
$this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone' WHERE (type = 0)");
}
public function testUpdateWorksWithMultipleColumns() {
$q = new Doctrine_Query();
$q->parseQuery("UPDATE User u SET u.name = 'someone', u.email_id = 5");
$this->assertEqual($q->getQuery(), "UPDATE entity e SET e.name = 'someone', e.email_id = 5 WHERE (e.type = 0)");
$this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone', email_id = 5 WHERE (type = 0)");
$q = new Doctrine_Query();
$q->update('User u')->set('u.name', "'someone'")->set('u.email_id', 5);
$this->assertEqual($q->getQuery(), "UPDATE entity e SET e.name = 'someone', e.email_id = 5 WHERE (e.type = 0)");
$this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone', email_id = 5 WHERE (type = 0)");
}
public function testUpdateSupportsConditions() {
$q = new Doctrine_Query();
$q->parseQuery("UPDATE User u SET u.name = 'someone' WHERE u.id = 5");
$this->assertEqual($q->getQuery(), "UPDATE entity SET name = 'someone' WHERE id = 5 AND (type = 0)");
}
}
?>

View File

@ -62,7 +62,7 @@ $test = new GroupTest('Doctrine Framework Unit Tests');
// DATABASE ABSTRACTION tests
/**
// Connection drivers (not yet fully tested)
$test->addTestCase(new Doctrine_Connection_Pgsql_TestCase());
$test->addTestCase(new Doctrine_Connection_Oracle_TestCase());
@ -196,7 +196,7 @@ $test->addTestCase(new Doctrine_CustomResultSetOrderTestCase());
//$test->addTestCase(new Doctrine_Collection_Offset_TestCase());
// Query tests
// Query tests */
$test->addTestCase(new Doctrine_Query_MultiJoin_TestCase());
$test->addTestCase(new Doctrine_Query_ReferenceModel_TestCase());
@ -205,7 +205,7 @@ $test->addTestCase(new Doctrine_Query_ComponentAlias_TestCase());
$test->addTestCase(new Doctrine_Query_TestCase());
$test->addTestCase(new Doctrine_Query_ShortAliases_TestCase());
$test->addTestCase(new Doctrine_Query_Delete_TestCase());
$test->addTestCase(new Doctrine_Query_Where_TestCase());
$test->addTestCase(new Doctrine_Query_Limit_TestCase());
$test->addTestCase(new Doctrine_Query_IdentifierQuoting_TestCase());
@ -229,6 +229,8 @@ $test->addTestCase(new Doctrine_Cache_Apc_TestCase());
$test->addTestCase(new Doctrine_Cache_Memcache_TestCase());
$test->addTestCase(new Doctrine_Cache_Sqlite_TestCase());
$test->addTestCase(new Doctrine_Query_Delete_TestCase());
// Cache tests
//$test->addTestCase(new Doctrine_Cache_Query_SqliteTestCase());
//$test->addTestCase(new Doctrine_Cache_FileTestCase());