1
0
mirror of synced 2024-12-15 23:56:02 +03:00
doctrine2/tests/Ticket/749TestCase.php

150 lines
4.4 KiB
PHP

<?php
/**
* Doctrine_Ticket_749_TestCase
*
* @package Doctrine
* @author David Brewer <dbrewer@secondstory.com>
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
* @version $Revision$
*
* This test case demonstrates a problem with column aggregation inheritance
* in Doctrine 0.9. The high level summary is that it is possible to make
* it work in general -- if class B is a subclass of class A, you can select
* from class A and get back objects of class B. However, those objects do
* not have the related objects of class B, and in fact an exception is
* thrown when you try to access those related objects.
*
* This test case should not probably be applied to trunk and possibly not
* to 0.10 branch. I'm not sure it's even possible to fix in 0.9 but it is
* an issue that keeps arising for me so it seemed worth a test case.
*/
class Doctrine_Ticket_749_TestCase extends Doctrine_UnitTestCase
{
public function prepareTables()
{
$this->tables = array('Parent749', 'Record749', 'RelatedRecord749');
parent::prepareTables();
}
public function prepareData()
{
$record = new Record749();
$record['title'] = 'Test Record 1';
$record['Related']['content'] = 'Test Content 1';
$record->save();
$record = new Record749();
$record['title'] = 'Test Record 2';
$record['Related']['content'] = 'Test Content 2';
$record->save();
}
public function testSelectDataFromSubclassAsCollection()
{
$records = Doctrine_Query::create()->query('
FROM Record749 r ORDER BY r.title
', array());
$this->verifyRecords($records);
}
public function testSelectDataFromParentClassAsCollection()
{
$records = Doctrine_Query::create()->query('
FROM Parent749 p ORDER BY p.title
', array());
$this->verifyRecords($records);
}
/**
* This method is used by both tests, as the collection of records should
* be identical for both of them if things are working properly.
*/
private function verifyRecords ($records) {
$expected_values = array(
array('title'=>'Test Record 1', 'content'=>'Test Content 1'),
array('title'=>'Test Record 2', 'content'=>'Test Content 2'),
);
foreach ($records as $record) {
$this->assertTrue($record instanceof Record749);
$expected = array_shift($expected_values);
$this->assertEqual($record['title'], $expected['title']);
try {
$this->assertEqual($record['Related']['content'], $expected['content']);
} catch (Exception $e) {
$this->fail('Caught exception when trying to get related content.');
}
}
}
}
class Parent749 extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('mytable');
$this->hasColumn('id', 'integer', 4, array (
'primary' => true,
'autoincrement' => true,
'notnull' => true,
));
$this->hasColumn('title', 'string', 255, array ());
$this->hasColumn('type', 'integer', 11, array ());
$this->option('subclasses', array('Record749'));
}
public function setUp()
{
}
}
class Record749 extends Parent749
{
public function setTableDefinition()
{
parent::setTableDefinition();
$this->setTableName('mytable');
}
public function setUp()
{
parent::setUp();
$this->hasOne('RelatedRecord749 as Related', array('local' => 'id',
'foreign' => 'record_id'));
$this->setInheritanceMap(array('type' => '1'));
}
}
class RelatedRecord749 extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('id', 'integer', 4, array (
'primary' => true,
'autoincrement' => true,
'notnull' => true,
));
$this->hasColumn('content', 'string', 255, array ());
$this->hasColumn('record_id', 'integer', null, array ('unique' => true,));
}
public function setUp()
{
$this->hasOne('Record749 as Record', array('local' => 'record_id',
'foreign' => 'id',
'onDelete' => 'cascade'));
}
}