1<?php 2 3/** 4 * @author Donald Ball 5 */ 6class Doctrine_Ticket_941_TestCase extends Doctrine_UnitTestCase 7{ 8 9 public function prepareTables() 10 { 11 $this->tables = array('Site', 'Variable', 'SiteVarvalue'); 12 parent::prepareTables(); 13 } 14 15 public function prepareData() 16 { 17 $site = new Site(); 18 $site->site_id = 1; 19 $site->site_domain = 'site1'; 20 $site->save(); 21 22 $site = new Site(); 23 $site->site_id = 2; 24 $site->site_domain = 'site2'; 25 $site->save(); 26 27 $var = new Variable(); 28 $var->variable_id = 1; 29 $var->variable_name = 'var1'; 30 $var->save(); 31 32 $var = new Variable(); 33 $var->variable_id = 2; 34 $var->variable_name = 'var2'; 35 $var->save(); 36 37 $varval = new SiteVarvalue(); 38 $varval->site_id = 1; 39 $varval->variable_id = 1; 40 $varval->varvalue_value = 'val1 dom1 var1'; 41 $varval->save(); 42 43 $varval = new SiteVarvalue(); 44 $varval->site_id = 1; 45 $varval->variable_id = 2; 46 $varval->varvalue_value = 'val2 dom1 var2'; 47 $varval->save(); 48 49 $varval = new SiteVarvalue(); 50 $varval->site_id = 2; 51 $varval->variable_id = 1; 52 $varval->varvalue_value = 'val3 dom2 var1'; 53 $varval->save(); 54 55 $varval = new SiteVarvalue(); 56 $varval->site_id = 2; 57 $varval->variable_id = 2; 58 $varval->varvalue_value = 'val4 dom2 var2'; 59 $varval->save(); 60 } 61 62 public function testTicket() 63 { 64 $query = new Doctrine_Query(); 65 $query = $query->from('Site s LEFT JOIN s.Variables v LEFT JOIN v.Values vv WITH vv.site_id = s.site_id'); 66 67 $sites = $query->execute(); 68 69 $this->assertEqual('site1', $sites[0]->site_domain); 70 $this->assertEqual(2, count($sites)); 71 72 // this is important for the understanding of the behavior 73 $this->assertIdentical($sites[0]->Variables[0], $sites[1]->Variables[0]); 74 $this->assertIdentical($sites[0]->Variables[1], $sites[1]->Variables[1]); 75 $this->assertEqual(2, count($sites[0]->Variables[0]->Values)); 76 $this->assertEqual(2, count($sites[1]->Variables[0]->Values)); 77 $this->assertEqual(2, count($sites[0]->Variables[1]->Values)); 78 $this->assertEqual(2, count($sites[1]->Variables[1]->Values)); 79 // Here we see that there can be only one Values on each Variable object. Hence 80 // they end up with 2 objects each. 81 $this->assertEqual('val1 dom1 var1', $sites[0]->Variables[0]->Values[0]->varvalue_value); 82 $this->assertEqual('val3 dom2 var1', $sites[0]->Variables[0]->Values[1]->varvalue_value); 83 $this->assertEqual('val2 dom1 var2', $sites[0]->Variables[1]->Values[0]->varvalue_value); 84 $this->assertEqual('val4 dom2 var2', $sites[0]->Variables[1]->Values[1]->varvalue_value); 85 86 $this->assertEqual('var1', $sites[0]->Variables[0]->variable_name); 87 $this->assertEqual('var1', $sites[1]->Variables[0]->variable_name); 88 89 $this->assertEqual('var2', $sites[0]->Variables[1]->variable_name); 90 $this->assertEqual('var2', $sites[1]->Variables[1]->variable_name); 91 92 93 // now array hydration 94 95 $sites = $query->fetchArray(); 96 97 $this->assertEqual('site1', $sites[0]['site_domain']); 98 $this->assertEqual('site2', $sites[1]['site_domain']); 99 $this->assertEqual(2, count($sites)); 100 101 // this is important for the understanding of the behavior 102 $this->assertEqual(1, count($sites[0]['Variables'][0]['Values'])); 103 $this->assertEqual(1, count($sites[1]['Variables'][0]['Values'])); 104 $this->assertEqual(1, count($sites[0]['Variables'][1]['Values'])); 105 $this->assertEqual(1, count($sites[1]['Variables'][1]['Values'])); 106 // Here we see that the Values collection of the *same* Variable object can have 107 // different contents when hydrating arrays 108 $this->assertEqual('val1 dom1 var1', $sites[0]['Variables'][0]['Values'][0]['varvalue_value']); 109 $this->assertEqual('val3 dom2 var1', $sites[1]['Variables'][0]['Values'][0]['varvalue_value']); 110 // Here we see that the Values collection of the *same* Variable object can have 111 // different contents when hydrating arrays 112 $this->assertEqual('val2 dom1 var2', $sites[0]['Variables'][1]['Values'][0]['varvalue_value']); 113 $this->assertEqual('val4 dom2 var2', $sites[1]['Variables'][1]['Values'][0]['varvalue_value']); 114 115 $this->assertEqual('var1', $sites[0]['Variables'][0]['variable_name']); 116 $this->assertEqual('var1', $sites[1]['Variables'][0]['variable_name']); 117 118 $this->assertEqual('var2', $sites[0]['Variables'][1]['variable_name']); 119 $this->assertEqual('var2', $sites[1]['Variables'][1]['variable_name']); 120 121 } 122 123} 124 125abstract class BaseSite extends Doctrine_Record 126{ 127 128 public function setTableDefinition() 129 { 130 $this->setTableName('_site'); 131 $this->hasColumn('site_id', 'integer', 4, array('notnull' => true, 'primary' => true, 'autoincrement' => true)); 132 $this->hasColumn('site_domain', 'string', 255, array('notnull' => true)); 133 } 134 135 public function setUp() 136 { 137 parent::setUp(); 138 $this->hasMany('Variable as Variables', array('refClass' => 'SiteVarvalue', 139 'local' => 'site_id', 140 'foreign' => 'variable_id')); 141 } 142 143} 144abstract class BaseVariable extends Doctrine_Record 145{ 146 147 public function setTableDefinition() 148 { 149 $this->setTableName('_variable'); 150 $this->hasColumn('variable_id', 'integer', 4, array('notnull' => true, 'primary' => true, 'autoincrement' => true)); 151 $this->hasColumn('variable_name', 'string', 100, array('notnull' => true)); 152 } 153 154 public function setUp() 155 { 156 parent::setUp(); 157 $this->hasMany('Site as Sites', array('refClass' => 'SiteVarvalue', 158 'local' => 'variable_id', 159 'foreign' => 'site_id')); 160 161 $this->hasMany('SiteVarvalue as Values', array('local' => 'variable_id', 162 'foreign' => 'variable_id')); 163 } 164 165} 166abstract class BaseSiteVarvalue extends Doctrine_Record 167{ 168 169 public function setTableDefinition() 170 { 171 $this->setTableName('_site_varvalue'); 172 $this->hasColumn('varvalue_id', 'integer', 4, array('notnull' => true, 'primary' => true, 'autoincrement' => true)); 173 $this->hasColumn('site_id', 'integer', 4, array('notnull' => true)); 174 $this->hasColumn('variable_id', 'integer', 4, array('notnull' => true)); 175 $this->hasColumn('varvalue_value', 'string', null, array('notnull' => true)); 176 } 177 178 public function setUp() 179 { 180 parent::setUp(); 181 $this->hasOne('Variable as Variables', array('local' => 'variable_id', 182 'foreign' => 'variable_id')); 183 } 184 185} 186class Site extends BaseSite 187{ 188} 189class Variable extends BaseVariable 190{ 191} 192class SiteVarvalue extends BaseSiteVarvalue 193{ 194} 195