Fixed many-to-many handling when join table component is accessed before the associated component, fixes #136, #84
This commit is contained in:
parent
bbc3d3f6be
commit
00cbc5d18e
@ -585,10 +585,12 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable {
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* getRelation
|
||||
*
|
||||
* @param string $name component name of which a foreign key object is bound
|
||||
* @return Doctrine_Relation
|
||||
*/
|
||||
final public function getRelation($name) {
|
||||
final public function getRelation($name, $recursive = true) {
|
||||
$original = $name;
|
||||
|
||||
if(isset($this->relations[$name]))
|
||||
@ -672,10 +674,13 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable {
|
||||
$this->relations[$alias] = $relation;
|
||||
return $this->relations[$alias];
|
||||
}
|
||||
try {
|
||||
// load all relations
|
||||
$this->getRelations();
|
||||
|
||||
if($recursive) {
|
||||
return $this->getRelation($original, false);
|
||||
} else {
|
||||
throw new Doctrine_Table_Exception($this->name . " doesn't have a relation to " . $original);
|
||||
} catch(Exception $e) {
|
||||
print $e;
|
||||
}
|
||||
}
|
||||
/**
|
||||
|
183
tests/ConnectionTransactionTestCase.php
Normal file
183
tests/ConnectionTransactionTestCase.php
Normal file
@ -0,0 +1,183 @@
|
||||
<?php
|
||||
class Transaction_TestLogger implements Doctrine_Overloadable {
|
||||
private $messages = array();
|
||||
|
||||
public function __call($m, $a) {
|
||||
$this->messages[] = $m;
|
||||
}
|
||||
public function pop() {
|
||||
return array_pop($this->messages);
|
||||
}
|
||||
public function clear() {
|
||||
$this->messages = array();
|
||||
}
|
||||
public function getAll() {
|
||||
return $this->messages;
|
||||
}
|
||||
}
|
||||
|
||||
class Doctrine_Connection_Transaction_TestCase extends Doctrine_UnitTestCase {
|
||||
public function prepareData() { }
|
||||
public function testInsert() {
|
||||
$count = count($this->dbh);
|
||||
|
||||
|
||||
$listener = new Transaction_TestLogger();
|
||||
|
||||
$user = new User();
|
||||
$user->getTable()->getConnection()->setListener($listener);
|
||||
|
||||
$this->connection->beginTransaction();
|
||||
|
||||
$user->name = 'John';
|
||||
|
||||
$user->save();
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onSave');
|
||||
$this->assertEqual($listener->pop(), 'onInsert');
|
||||
$this->assertEqual($listener->pop(), 'onPreInsert');
|
||||
$this->assertEqual($listener->pop(), 'onPreSave');
|
||||
$this->assertEqual($listener->pop(), 'onSetProperty');
|
||||
$this->assertEqual($listener->pop(), 'onTransactionBegin');
|
||||
$this->assertEqual($listener->pop(), 'onPreTransactionBegin');
|
||||
|
||||
$this->assertEqual($user->id, 1);
|
||||
|
||||
$this->assertTrue($count < count($this->dbh));
|
||||
|
||||
$this->connection->commit();
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onTransactionCommit');
|
||||
$this->assertEqual($listener->pop(), 'onPreTransactionCommit');
|
||||
}
|
||||
public function testInsertMultiple() {
|
||||
$count = count($this->dbh);
|
||||
|
||||
|
||||
$listener = new Transaction_TestLogger();
|
||||
|
||||
$users = new Doctrine_Collection('User');
|
||||
$users->getTable()->getConnection()->setListener($listener);
|
||||
|
||||
$this->connection->beginTransaction();
|
||||
|
||||
$users[0]->name = 'Arnold';
|
||||
$users[1]->name = 'Vincent';
|
||||
|
||||
$users[0]->save();
|
||||
$users[1]->save();
|
||||
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onSave');
|
||||
$this->assertEqual($listener->pop(), 'onInsert');
|
||||
$this->assertEqual($listener->pop(), 'onPreInsert');
|
||||
$this->assertEqual($listener->pop(), 'onPreSave');
|
||||
$this->assertEqual($listener->pop(), 'onSave');
|
||||
$this->assertEqual($listener->pop(), 'onInsert');
|
||||
$this->assertEqual($listener->pop(), 'onPreInsert');
|
||||
$this->assertEqual($listener->pop(), 'onPreSave');
|
||||
|
||||
$this->assertEqual($users[0]->id, 2);
|
||||
|
||||
$this->assertEqual($users[1]->id, 3);
|
||||
|
||||
$this->assertTrue($count < count($this->dbh));
|
||||
|
||||
$this->connection->commit();
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onTransactionCommit');
|
||||
$this->assertEqual($listener->pop(), 'onPreTransactionCommit');
|
||||
}
|
||||
public function testUpdate() {
|
||||
$count = count($this->dbh);
|
||||
|
||||
|
||||
$user = $this->connection->getTable('User')->find(1);
|
||||
|
||||
$listener = new Transaction_TestLogger();
|
||||
$user->getTable()->getConnection()->setListener($listener);
|
||||
$this->connection->beginTransaction();
|
||||
|
||||
$user->name = 'Jack';
|
||||
|
||||
$user->save();
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onSave');
|
||||
$this->assertEqual($listener->pop(), 'onUpdate');
|
||||
$this->assertEqual($listener->pop(), 'onPreUpdate');
|
||||
$this->assertEqual($listener->pop(), 'onPreSave');
|
||||
$this->assertEqual($listener->pop(), 'onSetProperty');
|
||||
$this->assertEqual($listener->pop(), 'onTransactionBegin');
|
||||
$this->assertEqual($listener->pop(), 'onPreTransactionBegin');
|
||||
|
||||
$this->assertEqual($user->id, 1);
|
||||
|
||||
$this->assertTrue($count < count($this->dbh));
|
||||
|
||||
$this->connection->commit();
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onTransactionCommit');
|
||||
$this->assertEqual($listener->pop(), 'onPreTransactionCommit');
|
||||
}
|
||||
public function testUpdateMultiple() {
|
||||
$count = count($this->dbh);
|
||||
|
||||
$listener = new Transaction_TestLogger();
|
||||
|
||||
$users = $this->connection->query('FROM User');
|
||||
$users->getTable()->getConnection()->setListener($listener);
|
||||
|
||||
$this->connection->beginTransaction();
|
||||
|
||||
$users[1]->name = 'Arnold';
|
||||
$users[2]->name = 'Vincent';
|
||||
|
||||
$users[1]->save();
|
||||
$users[2]->save();
|
||||
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onSave');
|
||||
$this->assertEqual($listener->pop(), 'onUpdate');
|
||||
$this->assertEqual($listener->pop(), 'onPreUpdate');
|
||||
$this->assertEqual($listener->pop(), 'onPreSave');
|
||||
$this->assertEqual($listener->pop(), 'onSave');
|
||||
$this->assertEqual($listener->pop(), 'onUpdate');
|
||||
$this->assertEqual($listener->pop(), 'onPreUpdate');
|
||||
$this->assertEqual($listener->pop(), 'onPreSave');
|
||||
|
||||
$this->assertEqual($users[1]->id, 2);
|
||||
|
||||
$this->assertEqual($users[2]->id, 3);
|
||||
|
||||
$this->assertTrue($count < count($this->dbh));
|
||||
|
||||
$this->connection->commit();
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onTransactionCommit');
|
||||
$this->assertEqual($listener->pop(), 'onPreTransactionCommit');
|
||||
}
|
||||
public function testDelete() {
|
||||
$count = count($this->dbh);
|
||||
|
||||
$listener = new Transaction_TestLogger();
|
||||
$listener->clear();
|
||||
$users = $this->connection->query('FROM User');
|
||||
$users->getTable()->getConnection()->setListener($listener);
|
||||
|
||||
$this->connection->beginTransaction();
|
||||
|
||||
$users->delete();
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onPreDelete');
|
||||
|
||||
$this->assertTrue($count, count($this->dbh));
|
||||
|
||||
$this->connection->commit();
|
||||
|
||||
$this->assertTrue(($count + 1), count($this->dbh));
|
||||
|
||||
$this->assertEqual($listener->pop(), 'onTransactionCommit');
|
||||
$this->assertEqual($listener->pop(), 'onPreTransactionCommit');
|
||||
}
|
||||
}
|
||||
?>
|
35
tests/RelationTestCase.php
Normal file
35
tests/RelationTestCase.php
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
class Doctrine_Relation_TestCase extends Doctrine_UnitTestCase {
|
||||
public function prepareData() { }
|
||||
public function prepareTables() {
|
||||
$this->tables = array();
|
||||
}
|
||||
public function testManyToManyRelation() {
|
||||
$user = new User();
|
||||
|
||||
// test that join table relations can be initialized even before the association have been initialized
|
||||
try {
|
||||
$user->Groupuser;
|
||||
$this->pass();
|
||||
} catch(Doctrine_Table_Exception $e) {
|
||||
$this->fail();
|
||||
}
|
||||
$this->assertTrue($user->getTable()->getRelation('Groupuser') instanceof Doctrine_Relation_ForeignKey);
|
||||
$this->assertTrue($user->getTable()->getRelation('Group') instanceof Doctrine_Relation_Association);
|
||||
}
|
||||
public function testOneToOneLocalKeyRelation() {
|
||||
$user = new User();
|
||||
|
||||
$this->assertTrue($user->getTable()->getRelation('Email') instanceof Doctrine_Relation_LocalKey);
|
||||
}
|
||||
public function testOneToOneForeignKeyRelation() {
|
||||
$user = new User();
|
||||
|
||||
$this->assertTrue($user->getTable()->getRelation('Account') instanceof Doctrine_Relation_ForeignKey);
|
||||
}
|
||||
public function testOneToManyForeignKeyRelation() {
|
||||
$user = new User();
|
||||
|
||||
$this->assertTrue($user->getTable()->getRelation('Phonenumber') instanceof Doctrine_Relation_ForeignKey);
|
||||
}
|
||||
}
|
@ -33,12 +33,15 @@ require_once("ImportTestCase.php");
|
||||
require_once("BooleanTestCase.php");
|
||||
require_once("EnumTestCase.php");
|
||||
require_once("RelationAccessTestCase.php");
|
||||
require_once("RelationTestCase.php");
|
||||
require_once("DataDictSqliteTestCase.php");
|
||||
|
||||
error_reporting(E_ALL);
|
||||
|
||||
$test = new GroupTest("Doctrine Framework Unit Tests");
|
||||
|
||||
$test->addTestCase(new Doctrine_Relation_TestCase());
|
||||
/**
|
||||
$test->addTestCase(new Doctrine_EventListenerTestCase());
|
||||
|
||||
$test->addTestCase(new Doctrine_RecordTestCase());
|
||||
@ -98,7 +101,7 @@ $test->addTestCase(new Doctrine_BooleanTestCase());
|
||||
$test->addTestCase(new Doctrine_QueryTestCase());
|
||||
|
||||
$test->addTestCase(new Doctrine_EventListener_Chain_TestCase());
|
||||
|
||||
*/
|
||||
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
|
||||
//$test->addTestCase(new Doctrine_Cache_SqliteTestCase());
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user