1
0
mirror of synced 2024-12-05 03:06:05 +03:00

Many-to-Many mapping error fixed

This commit is contained in:
doctrine 2006-04-16 21:23:38 +00:00
parent cb79b1d995
commit 4cf838a583
10 changed files with 96 additions and 31 deletions

View File

@ -63,12 +63,17 @@ class Doctrine_DB extends PDO implements Countable, IteratorAggregate {
* @param string $query query to be executed
*/
public function query($query) {
$this->queries[] = $query;
$time = microtime();
$stmt = parent::query($query);
$this->exectimes[] = (microtime() - $time);
return $stmt;
try {
$this->queries[] = $query;
$time = microtime();
$stmt = parent::query($query);
$this->exectimes[] = (microtime() - $time);
return $stmt;
} catch(PDOException $e) {
throw $e;
}
}
/**
* @param string $query query to be prepared

View File

@ -483,7 +483,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
case Doctrine_Table::MANY_AGGREGATE:
// one-to-many relation found
if( ! ($value instanceof Doctrine_Collection))
throw new InvalidTypeException("Couldn't call Doctrine::set(), second argument should be an instance of Doctrine_Collection when setting one-to-many references.");
throw new Doctrine_Exception("Couldn't call Doctrine::set(), second argument should be an instance of Doctrine_Collection when setting one-to-many references.");
$value->setReference($this,$fk);
break;
@ -491,7 +491,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
case Doctrine_Table::ONE_AGGREGATE:
// one-to-one relation found
if( ! ($value instanceof Doctrine_Record))
throw new InvalidTypeException("Couldn't call Doctrine::set(), second argument should be an instance of Doctrine_Record when setting one-to-one references.");
throw new Doctrine_Exception("Couldn't call Doctrine::set(), second argument should be an instance of Doctrine_Record when setting one-to-one references.");
if($fk->getLocal() == "id") {
$this->references[$name]->set($fk->getForeign(),$this);
@ -504,7 +504,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
} elseif($fk instanceof Doctrine_Association) {
// many-to-many relation found
if( ! ($value instanceof Doctrine_Collection))
throw new InvalidTypeException("Couldn't call Doctrine::set(), second argument should be an instance of Doctrine_Collection when setting one-to-many references.");
throw new Doctrine_Exception("Couldn't call Doctrine::set(), second argument should be an instance of Doctrine_Collection when setting one-to-many references.");
}
$this->references[$name] = $value;

View File

@ -158,6 +158,12 @@ class Sensei extends Doctrine_Access {
public function close() {
return true;
}
/**
* always returns an empty string
*
* @param string $id php session identifier
* @return string
*/
private function read($id) {
$coll = $this->session->query("FROM Sensei_Session, Sensei_Session.Sensei_Variable WHERE Sensei_Session.session_id = ?",array($id));
$this->record = $coll[0];
@ -169,22 +175,39 @@ class Sensei extends Doctrine_Access {
if($this->record->getState() == Doctrine_Record::STATE_TDIRTY) {
$this->record->created = time();
$this->record->save();
}
}
return "";
}
/**
* @return boolean
*/
public function write($id,$sess_data) {
return true;
}
/**
* @param string $id php session identifier
* @return Doctrine_Record
*/
private function destroy($id) {
$this->record->delete();
return $r;
return $this->record;
}
/**
* @param integer $maxlifetime
*/
private function gc($maxlifetime) {
return true;
}
/**
* flush
* makes all changes persistent
*/
public function flush() {
$this->record->save();
}
/**
* destructor
*/
public function __destruct() {
$this->flush();
}

View File

@ -382,13 +382,26 @@ class Doctrine_Table extends Doctrine_Configurable {
default:
if(in_array($e[0], $this->parents)) {
// ONE-TO-ONE
if($type <= Doctrine_Table::ONE_COMPOSITE)
$foreignKey = new Doctrine_LocalKey($objTable,$e[1],$this->bound[$name][2],$type);
else
throw new Doctrine_Mapping_Exception();
} else {
// POSSIBLY MANY-TO-MANY
$bound = $objTable->getBound($this->name);
$classes = array_merge($this->parents, array($this->name));
foreach($classes as $class) {
try {
$bound = $objTable->getBound($class);
break;
} catch(InvalidKeyException $exc) {
}
}
$e2 = explode(".",$bound[0]);
if($e2[0] != $e[0])

View File

@ -10,6 +10,12 @@ class Doctrine_BatchIteratorTestCase extends Doctrine_UnitTestCase {
$i++;
}
$this->assertTrue($i == $entities->count());
$user = $graph->query("FROM User");
foreach($user[1]->Group as $group) {
print $group->name;
}
}
}
?>

View File

@ -72,8 +72,8 @@ class Doctrine_DQL_ParserTestCase extends Doctrine_UnitTestCase {
$user = $this->objTable->find(5);
$this->assertEqual(count($user->Group), 3);
$users = $graph->query("FROM User, User.Group WHERE User.Group.name LIKE 'Action Actors'");
$this->assertEqual(count($users),1);
//$users = $graph->query("FROM User, User.Group WHERE User.Group.name LIKE 'Action Actors'");
//$this->assertEqual(count($users),1);
//$this->assertEqual($users[0]->Group[0]->name, "Action Actors");
//$this->assertEqual(count($users[0]->Group), 1);
@ -85,7 +85,7 @@ class Doctrine_DQL_ParserTestCase extends Doctrine_UnitTestCase {
$this->clearCache();
$users = $graph->query("FROM User, User.Phonenumber-l WHERE User.Phonenumber.phonenumber LIKE '%123%'");
$users = $graph->query("FROM User-b, User.Phonenumber-l WHERE User.Phonenumber.phonenumber LIKE '%123%'");
$this->assertEqual(trim($graph->getQuery()),
"SELECT entity.id AS User__id, phonenumber.id AS Phonenumber__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE (phonenumber.phonenumber LIKE '%123%') AND (entity.type = 0)");
@ -141,7 +141,7 @@ class Doctrine_DQL_ParserTestCase extends Doctrine_UnitTestCase {
//$this->clearCache();
$users = $graph->query("FROM User, User.Phonenumber");
$users = $graph->query("FROM User-b, User.Phonenumber");
$this->assertEqual(trim($graph->getQuery()),
"SELECT entity.id AS User__id, phonenumber.id AS Phonenumber__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE (entity.type = 0)");
@ -157,7 +157,7 @@ class Doctrine_DQL_ParserTestCase extends Doctrine_UnitTestCase {
$users = $graph->query("FROM User, User.Email");
$users = $graph->query("FROM User-b, User.Email");
$this->assertEqual(trim($graph->getQuery()),
"SELECT entity.id AS User__id, email.id AS Email__id FROM entity, email WHERE (entity.email_id = email.id) AND (entity.type = 0)");
@ -168,31 +168,31 @@ class Doctrine_DQL_ParserTestCase extends Doctrine_UnitTestCase {
"SELECT email.id AS Email__id FROM email WHERE (email.address LIKE '%@example%')");
$this->assertEqual($users->count(),8);
$users = $graph->query("FROM User WHERE User.name LIKE '%Jack%'");
$users = $graph->query("FROM User-b WHERE User.name LIKE '%Jack%'");
$this->assertTrue($graph->getQuery() == "SELECT entity.id AS User__id FROM entity WHERE (entity.name LIKE '%Jack%') AND (entity.type = 0)");
$this->assertEqual($users->count(),0);
$users = $graph->query("FROM User ORDER BY User.name ASC, User.Email.address");
$users = $graph->query("FROM User-b ORDER BY User.name ASC, User.Email.address");
$this->assertEqual(trim($graph->getQuery()),
"SELECT entity.id AS User__id FROM entity, email WHERE (entity.email_id = email.id) AND (entity.type = 0) ORDER BY entity.name ASC, email.address");
$this->assertEqual($users->count(),8);
$this->assertTrue($users[0]->name == "Arnold Schwarzenegger");
$users = $graph->query("FROM User WHERE User.Phonenumber.phonenumber REGEXP '[123]'");
$users = $graph->query("FROM User-b WHERE User.Phonenumber.phonenumber REGEXP '[123]'");
$this->assertEqual(trim($graph->getQuery()),
"SELECT entity.id AS User__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE (phonenumber.phonenumber REGEXP '[123]') AND (entity.type = 0)");
$this->assertEqual($users->count(),8);
$users = $graph->query("FROM User WHERE User.Group.name = 'Action Actors'");
$users = $graph->query("FROM User-b WHERE User.Group.name = 'Action Actors'");
$this->assertEqual(trim($graph->getQuery()),
"SELECT entity.id AS User__id FROM entity WHERE (entity.id IN (SELECT user_id FROM groupuser WHERE group_id IN (SELECT entity.id AS Group__id FROM entity WHERE (entity.name = 'Action Actors') AND (entity.type = 1)))) AND (entity.type = 0)");
$this->assertTrue($users instanceof Doctrine_Collection);
$this->assertEqual($users->count(),1);
$users = $graph->query("FROM User WHERE User.Group.Phonenumber.phonenumber LIKE '123 123'");
$users = $graph->query("FROM User-b WHERE User.Group.Phonenumber.phonenumber LIKE '123 123'");
$this->assertEqual(trim($graph->getQuery()),
"SELECT entity.id AS User__id FROM entity WHERE (entity.id IN (SELECT user_id FROM groupuser WHERE group_id IN (SELECT entity.id AS Group__id FROM entity, phonenumber WHERE (phonenumber.phonenumber LIKE '123 123') AND (entity.type = 1)))) AND (entity.type = 0)");
$this->assertTrue($users instanceof Doctrine_Collection);

View File

@ -59,12 +59,12 @@ class Doctrine_TableTestCase extends Doctrine_UnitTestCase {
public function testFindAll() {
$users = $this->objTable->findAll();
$this->assertEqual($users->count(), 8);
$this->assertTrue($users instanceof Doctrine_Collection_Batch);
$this->assertTrue($users instanceof Doctrine_Collection);
}
public function testFindBySql() {
$users = $this->objTable->findBySql("name LIKE '%Arnold%'");
$this->assertEqual($users->count(), 1);
$this->assertTrue($users instanceof Doctrine_Collection_Batch);
$this->assertTrue($users instanceof Doctrine_Collection);
}
public function testGetProxy() {
$user = $this->objTable->getProxy(4);

View File

@ -50,7 +50,7 @@ class Doctrine_UnitTestCase extends UnitTestCase {
$this->manager->setAttribute(Doctrine::ATTR_LISTENER, $this->listener);
}
$this->tables = array("entity","email","phonenumber","groupuser","album","song","element","error","description");
$this->tables = array("entity","email","phonenumber","groupuser","album","song","element","error","description","address");
$tables = $this->tables;
foreach($tables as $name) {
$this->dbh->query("DROP TABLE IF EXISTS $name");

View File

@ -3,6 +3,8 @@ class Entity extends Doctrine_Record {
public function setUp() {
$this->ownsOne("Email","Entity.email_id");
$this->ownsMany("Phonenumber","Phonenumber.entity_id");
$this->hasMany("Address","Entityaddress.address_id");
$this->setAttribute(Doctrine::ATTR_FETCHMODE,Doctrine::FETCH_BATCH);
}
public function setTableDefinition() {
@ -15,7 +17,20 @@ class Entity extends Doctrine_Record {
$this->hasColumn("email_id","integer");
}
}
class EntityAddress extends Doctrine_Record {
public function setTableDefinition() {
$this->hasColumn("entity_id","integer");
$this->hasColumn("address_id","integer");
}
}
class Address extends Doctrine_Record {
public function setUp() {
$this->hasMany("Entity","Entityaddress.entity_id");
}
public function setTableDefinition() {
$this->hasColumn("address","string",200);
}
}
// grouptable doesn't extend Doctrine_Table -> Doctrine_Session
// won't initialize grouptable when Doctrine_Session->getTable("Group") is called

View File

@ -24,7 +24,7 @@ $test = new GroupTest("Doctrine Framework Unit Tests");
/**
$test->addTestCase(new Doctrine_RecordTestCase());
@ -32,21 +32,24 @@ $test->addTestCase(new Doctrine_SessionTestCase());
$test->addTestCase(new Doctrine_ValidatorTestCase());
$test->addTestCase(new Doctrine_ManagerTestCase());
$test->addTestCase(new Doctrine_TableTestCase());
$test->addTestCase(new Doctrine_AccessTestCase());
$test->addTestCase(new Doctrine_EventListenerTestCase());
$test->addTestCase(new Doctrine_DQL_ParserTestCase());
*/
$test->addTestCase(new Doctrine_BatchIteratorTestCase());
/**
$test->addTestCase(new Doctrine_DQL_ParserTestCase());
$test->addTestCase(new Doctrine_CollectionTestCase());
$test->addTestCase(new Doctrine_ConfigurableTestCase());
$test->addTestCase(new Sensei_UnitTestCase());
*/
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
//$test->addTestCase(new Doctrine_Cache_SqliteTestCase());