Commit fc310cf3 authored by romanb's avatar romanb

Fixed #626. Commented out plugin tests due to a fatal error.

parent a73a73da
......@@ -268,9 +268,9 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
if ($relation instanceof Doctrine_Relation_ForeignKey ||
$relation instanceof Doctrine_Relation_LocalKey) {
$this->referenceField = $relation->getForeign();
$this->referenceField = $relation->getForeignFieldName();
$value = $record->get($relation->getLocal());
$value = $record->get($relation->getLocalFieldName());
foreach ($this->data as $record) {
if ($value !== null) {
......@@ -348,7 +348,7 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
$record = $this->_table->create();
if (isset($this->referenceField)) {
$value = $this->reference->get($this->relation->getLocal());
$value = $this->reference->get($this->relation->getLocalFieldName());
if ($value !== null) {
$record->set($this->referenceField, $value, false);
......@@ -436,7 +436,7 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
public function add(Doctrine_Record $record, $key = null)
{
if (isset($this->referenceField)) {
$value = $this->reference->get($this->relation->getLocal());
$value = $this->reference->get($this->relation->getLocalFieldName());
if ($value !== null) {
$record->set($this->referenceField, $value, false);
......
......@@ -66,6 +66,7 @@ abstract class Doctrine_Relation implements ArrayAccess
'class' => true,
'type' => true,
'table' => true,
'localTable' => true,
'name' => false,
'refTable' => false,
'onDelete' => false,
......@@ -88,6 +89,8 @@ abstract class Doctrine_Relation implements ArrayAccess
*
* table the foreign table object
*
* localTable the local table object
*
* refTable the reference table object (if any)
*
* onDelete referential delete action
......@@ -247,6 +250,15 @@ abstract class Doctrine_Relation implements ArrayAccess
return $this->definition['local'];
}
/**
* getLocalFieldName
* returns the field name of the local column
*/
final public function getLocalFieldName()
{
return $this->definition['localTable']->getFieldName($this->definition['local']);
}
/**
* getForeign
* returns the name of the foreignkey column where
......@@ -259,6 +271,15 @@ abstract class Doctrine_Relation implements ArrayAccess
return $this->definition['foreign'];
}
/**
* getLocalFieldName
* returns the field name of the local column
*/
final public function getForeignFieldName()
{
return $this->definition['table']->getFieldName($this->definition['foreign']);
}
/**
* isComposite
* returns whether or not this relation is a composite relation
......
......@@ -42,6 +42,8 @@ class Doctrine_Relation_Association_Self extends Doctrine_Relation_Association
{
switch ($context) {
case 'record':
$identifierColumnNames = $this->definition['table']->getIdentifierColumnNames();
$identifier = array_pop($identifierColumnNames);
$sub = 'SELECT '.$this->definition['foreign']
. ' FROM '.$this->definition['refTable']->getTableName()
. ' WHERE '.$this->definition['local']
......@@ -55,10 +57,10 @@ class Doctrine_Relation_Association_Self extends Doctrine_Relation_Association
$dql = 'FROM ' . $this->definition['table']->getComponentName()
. '.' . $this->definition['refTable']->getComponentName()
. ' WHERE ' . $this->definition['table']->getComponentName()
. '.' . $this->definition['table']->getIdentifier()
. '.' . $identifier
. ' IN (' . $sub . ')'
. ' || ' . $this->definition['table']->getComponentName()
. '.' . $this->definition['table']->getIdentifier()
. '.' . $identifier
. ' IN (' . $sub2 . ')';
break;
case 'collection':
......@@ -80,7 +82,8 @@ class Doctrine_Relation_Association_Self extends Doctrine_Relation_Association
$assocTable = $this->getAssociationFactory()->getTableName();
$tableName = $record->getTable()->getTableName();
$identifier = $record->getTable()->getIdentifier();
$identifierColumnNames = $record->getTable()->getIdentifierColumnNames();
$identifier = array_pop($identifierColumnNames);
$sub = 'SELECT '.$this->getForeign().
' FROM '.$assocTable.
......
......@@ -44,8 +44,9 @@ class Doctrine_Relation_ForeignKey extends Doctrine_Relation
public function fetchRelatedFor(Doctrine_Record $record)
{
$id = array();
$localTable = $record->getTable();
foreach ((array) $this->definition['local'] as $local) {
$value = $record->get($local);
$value = $record->get($localTable->getFieldName($local));
if (isset($value)) {
$id[] = $value;
}
......@@ -63,8 +64,8 @@ class Doctrine_Relation_ForeignKey extends Doctrine_Relation
$related = $coll[0];
}
$related->set($this->definition['foreign'], $record, false);
$related->set($related->getTable()->getFieldName($this->definition['foreign']),
$record, false);
} else {
if ( ! $record->exists() || empty($id) ||
......
......@@ -43,7 +43,8 @@ class Doctrine_Relation_LocalKey extends Doctrine_Relation
*/
public function fetchRelatedFor(Doctrine_Record $record)
{
$id = $record->get($this->definition['local']);
$localFieldName = $record->getTable()->getFieldName($this->definition['local']);
$id = $record->get($localFieldName);
if (empty($id) || ! $this->definition['table']->getAttribute(Doctrine::ATTR_LOAD_REFERENCES)) {
$related = $this->getTable()->create();
......@@ -61,7 +62,7 @@ class Doctrine_Relation_LocalKey extends Doctrine_Relation
}
}
$record->set($this->definition['local'], $related, false);
$record->set($localFieldName, $related, false);
return $related;
}
......
......@@ -42,6 +42,8 @@ class Doctrine_Relation_Nest extends Doctrine_Relation_Association
{
switch ($context) {
case 'record':
$identifierColumnNames = $this->definition['table']->getIdentifierColumnNames();
$identifier = array_pop($identifierColumnNames);
$sub = 'SELECT '.$this->definition['foreign']
. ' FROM '.$this->definition['refTable']->getTableName()
. ' WHERE '.$this->definition['local']
......@@ -55,10 +57,10 @@ class Doctrine_Relation_Nest extends Doctrine_Relation_Association
$dql = 'FROM ' . $this->definition['table']->getComponentName()
. '.' . $this->definition['refTable']->getComponentName()
. ' WHERE ' . $this->definition['table']->getComponentName()
. '.' . $this->definition['table']->getIdentifier()
. '.' . $identifier
. ' IN (' . $sub . ')'
. ' || ' . $this->definition['table']->getComponentName()
. '.' . $this->definition['table']->getIdentifier()
. '.' . $identifier
. ' IN (' . $sub2 . ')';
break;
case 'collection':
......@@ -110,7 +112,8 @@ class Doctrine_Relation_Nest extends Doctrine_Relation_Association
$assocTable = $this->getAssociationFactory()->getTableName();
$tableName = $record->getTable()->getTableName();
$identifier = $record->getTable()->getIdentifier();
$identifierColumnNames = $record->getTable()->getIdentifierColumnNames();
$identifier = array_pop($identifierColumnNames);
$sub = 'SELECT ' . $this->getForeign()
. ' FROM ' . $assocTable
......
......@@ -257,6 +257,7 @@ class Doctrine_Relation_Parser
{
$conn = $this->_table->getConnection();
$def['table'] = $this->getImpl($def['class']);
$def['localTable'] = $this->_table;
$def['class'] = $def['table']->getComponentName();
$def['refTable'] = $this->getImpl($def['refClass']);
......@@ -371,6 +372,7 @@ class Doctrine_Relation_Parser
{
$conn = $this->_table->getConnection();
$def['table'] = $this->getImpl($def['class']);
$def['localTable'] = $this->_table;
$def['class'] = $def['table']->getComponentName();
$foreignClasses = array_merge($def['table']->getOption('parents'), array($def['class']));
......
<?php
/**
* Doctrine_Ticket_626_TestCase
*
* @package Doctrine
* @author Tamcy <7am.online@gmail.com>
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
* @version $Revision$
*/
class Doctrine_Ticket_626B_TestCase extends Doctrine_UnitTestCase
{
public function prepareData()
{ }
public function prepareTables()
{
$this->tables = array('T626_Group', 'T626B_Student', 'T626_Course', 'T626B_StudentCourse');
parent::prepareTables();
}
protected function newCourse($id, $name)
{
$course = new T626_Course();
$course->id = $id;
$course->name = $name;
$course->save();
return $course;
}
protected function newGroup($id, $name)
{
$group = new T626_Group();
$group->id = $id;
$group->name = $name;
$group->save();
return $group;
}
protected function newStudent($id, $name, $group)
{
$u = new T626B_Student();
$u->id = $id;
$u->name = $name;
$u->group_id = $group->id;
$u->save();
return $u;
}
protected function newStudentCourse($student, $course)
{
$sc = new T626B_StudentCourse;
$sc->student_id = $student->id;
$sc->course_id = $course->id;
$sc->save();
return $sc;
}
public function testTicket()
{
$group1 = $this->newGroup('1', 'Group 1');
$student1 = $this->newStudent('07090002', 'First Student', $group1);
$course1 = $this->newCourse('MATH001', 'Maths');
$course2 = $this->newCourse('ENG002', 'English Literature');
$this->newStudentCourse($student1, $course1);
$this->newStudentCourse($student1, $course2);
try {
$group = $student1->get('Group');
$this->pass();
} catch (Exception $e) {
$this->fail($e->__toString());
}
try {
$courses = $student1->get('StudyCourses');
$this->pass();
} catch (Exception $e) {
$this->fail($e->__toString());
}
}
}
class T626B_Student extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('T626B_Student_record');
$this->hasColumn('s_id as id', 'varchar', 30, array ( 'primary' => true,));
$this->hasColumn('s_g_id as group_id', 'varchar', 30, array ('notnull'=>true));
$this->hasColumn('s_name as name', 'varchar', 50, array ());
}
public function setUp()
{
$this->hasMany('T626_Course as StudyCourses', array('refClass' => 'T626B_StudentCourse', 'local' => 'sc_student_id', 'foreign' => 'sc_course_id'));
$this->hasOne('T626_Group as Group', array('local' => 's_g_id', 'foreign' => 'g_id'));
}
}
class T626_Group extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('T626B_Student_group');
$this->hasColumn('g_id as id', 'varchar', 30, array ( 'primary' => true,));
$this->hasColumn('g_name as name', 'varchar', 50, array ());
}
public function setUp()
{
$this->hasMany('T626B_Student as Students',
array('local' => 'g_id', 'foreign' => 's_id'));
}
}
class T626_Course extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('T626_course');
$this->hasColumn('c_id as id', 'varchar', 20, array ( 'primary' => true,));
$this->hasColumn('c_name as name', 'varchar', 50, array ());
}
public function setUp()
{
$this->hasMany('T626B_Student as Students', array('refClass' => 'T626B_StudentCourse', 'local' => 'sc_course_id', 'foreign' => 'sc_student_id'));
}
}
class T626B_StudentCourse extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('T626B_Student_course');
$this->hasColumn('sc_student_id as student_id', 'varchar', 30, array ( 'primary' => true,));
$this->hasColumn('sc_course_id as course_id', 'varchar', 20, array ( 'primary' => true,));
$this->hasColumn('sc_remark as remark', 'varchar', 500, array ());
}
public function setUp()
{
$this->hasOne('T626B_Student as Student', array('local' => 'sc_student_id', 'foreign' => 's_id'));
$this->hasOne('T626_Course as Course', array('local' => 'sc_course_id', 'foreign' => 'c_id'));
}
}
......@@ -17,6 +17,7 @@ $tickets->addTestCase(new Doctrine_Ticket_480_TestCase());
$tickets->addTestCase(new Doctrine_Ticket_587_TestCase());
$tickets->addTestCase(new Doctrine_Ticket_576_TestCase());
$tickets->addTestCase(new Doctrine_Ticket_583_TestCase());
$tickets->addTestCase(new Doctrine_Ticket_626B_TestCase());
//If you write a ticket testcase add it here like shown above!
$test->addTestCase($tickets);
......@@ -147,7 +148,7 @@ $test->addTestCase($data_types);
// Utility components
$plugins = new GroupTest('Plugin tests: View, Validator, Hook','plugins');
//$utility->addTestCase(new Doctrine_PessimisticLocking_TestCase());
$plugins->addTestCase(new Doctrine_Plugin_TestCase());
//$plugins->addTestCase(new Doctrine_Plugin_TestCase());
$plugins->addTestCase(new Doctrine_View_TestCase());
$plugins->addTestCase(new Doctrine_AuditLog_TestCase());
$plugins->addTestCase(new Doctrine_Validator_TestCase());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment