Relation fetching refactoring
This commit is contained in:
parent
76081664b5
commit
e75f3598c3
@ -34,5 +34,27 @@ class Doctrine_Association extends Doctrine_Relation {
|
|||||||
public function getAssociationFactory() {
|
public function getAssociationFactory() {
|
||||||
return $this->associationTable;
|
return $this->associationTable;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* getRelationDql
|
||||||
|
*
|
||||||
|
* @param integer $count
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getRelationDql($count, $context = 'record') {
|
||||||
|
$sub = "SELECT ".$this->foreign.
|
||||||
|
" FROM ".$this->associationTable->getTableName().
|
||||||
|
" WHERE ".$this->local.
|
||||||
|
" IN (".substr(str_repeat("?, ", $count),0,-2).")";
|
||||||
|
|
||||||
|
$dql = "FROM ".$this->table->getComponentName();
|
||||||
|
|
||||||
|
if($context != 'record')
|
||||||
|
$dql .= ":".$this->associationTable->getComponentName();
|
||||||
|
|
||||||
|
$dql .= " WHERE ".$this->table->getComponentName().".".$this->table->getIdentifier().
|
||||||
|
" IN ($sub)";
|
||||||
|
|
||||||
|
return $dql;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -488,13 +488,16 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
|
|||||||
/**
|
/**
|
||||||
* loadRelated
|
* loadRelated
|
||||||
*
|
*
|
||||||
* @param string $name
|
* @param mixed $name
|
||||||
*/
|
*/
|
||||||
public function loadRelated($name) {
|
public function loadRelated($name = null) {
|
||||||
|
$query = new Doctrine_Query($this->table->getSession());
|
||||||
|
|
||||||
|
if( ! isset($name))
|
||||||
|
return $query;
|
||||||
|
|
||||||
$rel = $this->table->getForeignKey($name);
|
$rel = $this->table->getForeignKey($name);
|
||||||
$table = $rel->getTable();
|
$table = $rel->getTable();
|
||||||
$query = new Doctrine_Query($this->table->getSession());
|
|
||||||
$foreign = $rel->getForeign();
|
$foreign = $rel->getForeign();
|
||||||
$local = $rel->getLocal();
|
$local = $rel->getLocal();
|
||||||
|
|
||||||
@ -510,32 +513,7 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
|
|||||||
$list[] = $value;
|
$list[] = $value;
|
||||||
endforeach;
|
endforeach;
|
||||||
}
|
}
|
||||||
$paramStr = "(".substr(str_repeat("?, ", count($list)),0,-2).")";
|
$dql = $rel->getRelationDql(count($list), 'collection');
|
||||||
$multi = true;
|
|
||||||
|
|
||||||
if($rel instanceof Doctrine_LocalKey ||
|
|
||||||
$rel instanceof Doctrine_ForeignKey)
|
|
||||||
$dql = "FROM ".$table->getComponentName().
|
|
||||||
" WHERE ".$table->getComponentName().".".$rel->getForeign().
|
|
||||||
" IN ".$paramStr;
|
|
||||||
|
|
||||||
|
|
||||||
if($rel instanceof Doctrine_LocalKey) {
|
|
||||||
$multi = false;
|
|
||||||
} elseif($rel instanceof Doctrine_Association) {
|
|
||||||
$asf = $rel->getAssociationFactory();
|
|
||||||
$sub = "SELECT ".$foreign.
|
|
||||||
" FROM ".$asf->getTableName().
|
|
||||||
" WHERE ".$local.
|
|
||||||
" IN ".$paramStr;
|
|
||||||
|
|
||||||
$table->getForeignKey($table->getAlias($this->table->getComponentName()));
|
|
||||||
|
|
||||||
$dql = "FROM ".$table->getComponentName().":".$asf->getComponentName()." WHERE ".$table->getComponentName().".".$table->getIdentifier()." IN ($sub)";
|
|
||||||
//$query->parseQuery($dql);
|
|
||||||
//print Doctrine_Lib::formatSql($query->getQuery());
|
|
||||||
}
|
|
||||||
|
|
||||||
$coll = $query->query($dql, $list);
|
$coll = $query->query($dql, $list);
|
||||||
|
|
||||||
|
|
||||||
@ -567,6 +545,7 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator
|
|||||||
}
|
}
|
||||||
} elseif($rel instanceof Doctrine_Association) {
|
} elseif($rel instanceof Doctrine_Association) {
|
||||||
$identifier = $this->table->getIdentifier();
|
$identifier = $this->table->getIdentifier();
|
||||||
|
$asf = $rel->getAssociationFactory();
|
||||||
|
|
||||||
foreach($this->data as $key => $record) {
|
foreach($this->data as $key => $record) {
|
||||||
if($record->getState() == Doctrine_Record::STATE_TCLEAN ||
|
if($record->getState() == Doctrine_Record::STATE_TCLEAN ||
|
||||||
|
@ -1153,11 +1153,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
|
|
||||||
} elseif($fk instanceof Doctrine_Association) {
|
} elseif($fk instanceof Doctrine_Association) {
|
||||||
|
|
||||||
$asf = $fk->getAssociationFactory();
|
$query = $fk->getRelationDql(1);
|
||||||
$query = "SELECT ".$foreign." FROM ".$asf->getTableName()." WHERE ".$local." = ?";
|
|
||||||
|
|
||||||
$graph = new Doctrine_Query($table->getSession());
|
|
||||||
$query = "FROM ".$table->getComponentName()." WHERE ".$table->getComponentName().".".$table->getIdentifier()." IN ($query)";
|
|
||||||
|
|
||||||
$coll = $graph->query($query, array($this->getIncremented()));
|
$coll = $graph->query($query, array($this->getIncremented()));
|
||||||
|
|
||||||
|
@ -52,23 +52,23 @@ class Doctrine_Relation {
|
|||||||
/**
|
/**
|
||||||
* @var Doctrine_Table $table foreign factory
|
* @var Doctrine_Table $table foreign factory
|
||||||
*/
|
*/
|
||||||
private $table;
|
protected $table;
|
||||||
/**
|
/**
|
||||||
* @var string $local local field
|
* @var string $local local field
|
||||||
*/
|
*/
|
||||||
private $local;
|
protected $local;
|
||||||
/**
|
/**
|
||||||
* @var string $foreign foreign field
|
* @var string $foreign foreign field
|
||||||
*/
|
*/
|
||||||
private $foreign;
|
protected $foreign;
|
||||||
/**
|
/**
|
||||||
* @var integer $type bind type
|
* @var integer $type bind type
|
||||||
*/
|
*/
|
||||||
private $type;
|
protected $type;
|
||||||
/**
|
/**
|
||||||
* @var string $alias relation alias
|
* @var string $alias relation alias
|
||||||
*/
|
*/
|
||||||
private $alias;
|
protected $alias;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Doctrine_Table $table
|
* @param Doctrine_Table $table
|
||||||
@ -115,7 +115,19 @@ class Doctrine_Relation {
|
|||||||
final public function getForeign() {
|
final public function getForeign() {
|
||||||
return $this->foreign;
|
return $this->foreign;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* getRelationDql
|
||||||
|
*
|
||||||
|
* @param integer $count
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getRelationDql($count) {
|
||||||
|
$dql = "FROM ".$this->table->getComponentName().
|
||||||
|
" WHERE ".$this->table->getComponentName(). '.' . $this->foreign.
|
||||||
|
" IN (".substr(str_repeat("?, ", $count),0,-2).")";
|
||||||
|
|
||||||
|
return $dql;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* getDeleteOperations
|
* getDeleteOperations
|
||||||
*
|
*
|
||||||
|
@ -14,6 +14,13 @@ class Doctrine_CollectionTestCase extends Doctrine_UnitTestCase {
|
|||||||
$this->assertTrue($coll->count(),3);
|
$this->assertTrue($coll->count(),3);
|
||||||
$this->assertEqual($coll->getKeys(), array(0,1,2));
|
$this->assertEqual($coll->getKeys(), array(0,1,2));
|
||||||
}
|
}
|
||||||
|
public function testLoadRelated() {
|
||||||
|
$coll = $this->session->query("FROM User");
|
||||||
|
|
||||||
|
$q = $coll->loadRelated();
|
||||||
|
|
||||||
|
$this->assertTrue($q instanceof Doctrine_Query);
|
||||||
|
}
|
||||||
public function testLoadRelatedForAssociation() {
|
public function testLoadRelatedForAssociation() {
|
||||||
$coll = $this->session->query("FROM User");
|
$coll = $this->session->query("FROM User");
|
||||||
|
|
||||||
|
@ -46,8 +46,6 @@ $test->addTestCase(new Doctrine_ConfigurableTestCase());
|
|||||||
|
|
||||||
$test->addTestCase(new Doctrine_Collection_OffsetTestCase());
|
$test->addTestCase(new Doctrine_Collection_OffsetTestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_CollectionTestCase());
|
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_PessimisticLockingTestCase());
|
$test->addTestCase(new Doctrine_PessimisticLockingTestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_ViewTestCase());
|
$test->addTestCase(new Doctrine_ViewTestCase());
|
||||||
@ -65,6 +63,9 @@ $test->addTestCase(new Doctrine_Filter_TestCase());
|
|||||||
$test->addTestCase(new Doctrine_ValueHolder_TestCase());
|
$test->addTestCase(new Doctrine_ValueHolder_TestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_ValidatorTestCase());
|
$test->addTestCase(new Doctrine_ValidatorTestCase());
|
||||||
|
|
||||||
|
$test->addTestCase(new Doctrine_CollectionTestCase());
|
||||||
|
|
||||||
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
|
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
|
||||||
//$test->addTestCase(new Doctrine_Cache_SqliteTestCase());
|
//$test->addTestCase(new Doctrine_Cache_SqliteTestCase());
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user