Association self-referencing fetching now works (still not integrated into DQL)
This commit is contained in:
parent
fadef335c4
commit
3dca74f2d2
@ -1,4 +1,23 @@
|
|||||||
<?php
|
<?php
|
||||||
|
/*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This software consists of voluntary contributions made by many individuals
|
||||||
|
* and is licensed under the LGPL. For more information, see
|
||||||
|
* <http://www.phpdoctrine.com>.
|
||||||
|
*/
|
||||||
/**
|
/**
|
||||||
* Doctrine_Association this class takes care of association mapping
|
* Doctrine_Association this class takes care of association mapping
|
||||||
* (= many-to-many relationships, where the relationship is handled with an additional relational table
|
* (= many-to-many relationships, where the relationship is handled with an additional relational table
|
||||||
@ -13,7 +32,7 @@ class Doctrine_Association extends Doctrine_Relation {
|
|||||||
/**
|
/**
|
||||||
* @var Doctrine_Table $associationTable
|
* @var Doctrine_Table $associationTable
|
||||||
*/
|
*/
|
||||||
private $associationTable;
|
protected $associationTable;
|
||||||
/**
|
/**
|
||||||
* the constructor
|
* the constructor
|
||||||
* @param Doctrine_Table $table foreign factory object
|
* @param Doctrine_Table $table foreign factory object
|
||||||
@ -48,7 +67,7 @@ class Doctrine_Association extends Doctrine_Relation {
|
|||||||
" IN (".substr(str_repeat("?, ", $count),0,-2).")";
|
" IN (".substr(str_repeat("?, ", $count),0,-2).")";
|
||||||
|
|
||||||
$dql = "FROM ".$this->table->getComponentName();
|
$dql = "FROM ".$this->table->getComponentName();
|
||||||
$dql .= ":".$this->associationTable->getComponentName();
|
$dql .= ".".$this->associationTable->getComponentName();
|
||||||
$dql .= " WHERE ".$this->table->getComponentName().".".$this->table->getIdentifier()." IN ($sub)";
|
$dql .= " WHERE ".$this->table->getComponentName().".".$this->table->getIdentifier()." IN ($sub)";
|
||||||
break;
|
break;
|
||||||
case "collection":
|
case "collection":
|
||||||
|
@ -712,8 +712,8 @@ class Doctrine_Query extends Doctrine_Hydrate implements Countable {
|
|||||||
if( ! $loadFields) {
|
if( ! $loadFields) {
|
||||||
$this->subqueryAliases[] = $assocTableName;
|
$this->subqueryAliases[] = $assocTableName;
|
||||||
}
|
}
|
||||||
$this->parts["join"][$tname][$assocTableName] = $join.$assocTableName." ON ".$tname.".id = ".$assocTableName.".".$fk->getLocal();
|
$this->parts["join"][$tname][$assocTableName] = $join.$assocTableName." ON ".$tname.".".$table->getIdentifier()." = ".$assocTableName.".".$fk->getLocal();
|
||||||
$this->parts["join"][$tname][$tname2] = $join.$aliasString." ON ".$tname2.".id = ".$assocTableName.".".$fk->getForeign();
|
$this->parts["join"][$tname][$tname2] = $join.$aliasString." ON ".$tname2.".".$table->getIdentifier()." = ".$assocTableName.".".$fk->getForeign();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->joins[$tname2] = $prevTable;
|
$this->joins[$tname2] = $prevTable;
|
||||||
|
@ -123,8 +123,6 @@ class Doctrine_RawSql extends Doctrine_Hydrate {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getQuery() {
|
public function getQuery() {
|
||||||
|
|
||||||
|
|
||||||
foreach($this->fields as $field) {
|
foreach($this->fields as $field) {
|
||||||
$e = explode(".", $field);
|
$e = explode(".", $field);
|
||||||
if( ! isset($e[1]))
|
if( ! isset($e[1]))
|
||||||
|
@ -1201,6 +1201,37 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
$id = $this->get($local);
|
$id = $this->get($local);
|
||||||
$coll = $graph->query($query,array($id));
|
$coll = $graph->query($query,array($id));
|
||||||
$coll->setReference($this, $fk);
|
$coll->setReference($this, $fk);
|
||||||
|
} elseif($fk instanceof Doctrine_Association_Self) {
|
||||||
|
$id = $this->getIncremented();
|
||||||
|
|
||||||
|
$q = new Doctrine_RawSql();
|
||||||
|
|
||||||
|
$assocTable = $fk->getAssociationFactory()->getTableName();
|
||||||
|
$tableName = $this->getTable()->getTableName();
|
||||||
|
$identifier = $this->getTable()->getIdentifier();
|
||||||
|
|
||||||
|
$sub = "SELECT ".$fk->getForeign().
|
||||||
|
" FROM ".$assocTable.
|
||||||
|
" WHERE ".$fk->getLocal().
|
||||||
|
" = ?";
|
||||||
|
|
||||||
|
$sub2 = "SELECT ".$fk->getLocal().
|
||||||
|
" FROM ".$assocTable.
|
||||||
|
" WHERE ".$fk->getForeign().
|
||||||
|
" = ?";
|
||||||
|
|
||||||
|
$q->select('{'.$tableName.'.*}, {'.$assocTable.'.*}')
|
||||||
|
->from($tableName.' INNER JOIN '.$assocTable.' ON '.
|
||||||
|
$tableName.'.'.$identifier.' = '.$assocTable.'.'.$fk->getLocal().' OR '.
|
||||||
|
$tableName.'.'.$identifier.' = '.$assocTable.'.'.$fk->getForeign()
|
||||||
|
)
|
||||||
|
->where($tableName.'.'.$identifier.' IN ('.$sub.') OR '.
|
||||||
|
$tableName.'.'.$identifier.' IN ('.$sub2.')'
|
||||||
|
);
|
||||||
|
$q->addComponent($tableName, $this->table->getComponentName());
|
||||||
|
$q->addComponent($assocTable, $this->table->getComponentName().'.'.$fk->getAssociationFactory()->getComponentName());
|
||||||
|
|
||||||
|
$coll = $q->execute(array($id, $id));
|
||||||
} elseif($fk instanceof Doctrine_Association) {
|
} elseif($fk instanceof Doctrine_Association) {
|
||||||
$id = $this->getIncremented();
|
$id = $this->getIncremented();
|
||||||
$coll = $graph->query($query, array($id));
|
$coll = $graph->query($query, array($id));
|
||||||
|
@ -622,7 +622,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable {
|
|||||||
// SELF-REFERENCING THROUGH JOIN TABLE
|
// SELF-REFERENCING THROUGH JOIN TABLE
|
||||||
$this->relations[$e2[0]] = new Doctrine_ForeignKey($associationTable,$local,$fields[0],Doctrine_Relation::MANY_COMPOSITE, $e2[0]);
|
$this->relations[$e2[0]] = new Doctrine_ForeignKey($associationTable,$local,$fields[0],Doctrine_Relation::MANY_COMPOSITE, $e2[0]);
|
||||||
|
|
||||||
$relation = new Doctrine_Association($table,$associationTable,$fields[0],$fields[1], $type, $alias);
|
$relation = new Doctrine_Association_Self($table,$associationTable,$fields[0],$fields[1], $type, $alias);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// auto initialize a new one-to-one relationship for association table
|
// auto initialize a new one-to-one relationship for association table
|
||||||
|
@ -64,6 +64,14 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
|
|||||||
$this->assertEqual($array[0]['MAX(entity.id)'], 11);
|
$this->assertEqual($array[0]['MAX(entity.id)'], 11);
|
||||||
$this->assertEqual($array[0]['MIN(email.address)'], 'arnold@example.com');
|
$this->assertEqual($array[0]['MIN(email.address)'], 'arnold@example.com');
|
||||||
$this->assertEqual($array[0]['COUNT(1)'], 14);
|
$this->assertEqual($array[0]['COUNT(1)'], 14);
|
||||||
|
/**
|
||||||
|
$q = new Doctrine_Query();
|
||||||
|
$q->from("User.Phonenumber(COUNT(id))")->groupby("User.id");
|
||||||
|
$coll = $q->execute();
|
||||||
|
print Doctrine_Lib::formatSql($q->getQuery());
|
||||||
|
print_r($coll);
|
||||||
|
$this->assertEqual(count($coll), 8);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1224,5 +1232,6 @@ class Doctrine_QueryTestCase extends Doctrine_UnitTestCase {
|
|||||||
//$this->assertTrue(isset($values['max']));
|
//$this->assertTrue(isset($values['max']));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -7,6 +7,7 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
|
|||||||
$this->tables[] = "enumTest";
|
$this->tables[] = "enumTest";
|
||||||
parent::prepareTables();
|
parent::prepareTables();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testJoinTableSelfReferencingInsertingData() {
|
public function testJoinTableSelfReferencingInsertingData() {
|
||||||
$e = new Entity();
|
$e = new Entity();
|
||||||
$e->name = "Entity test";
|
$e->name = "Entity test";
|
||||||
@ -66,25 +67,14 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
|
|||||||
|
|
||||||
$this->assertEqual(count($result), 6);
|
$this->assertEqual(count($result), 6);
|
||||||
|
|
||||||
$q = "SELECT entity.id AS entity__id,
|
/**
|
||||||
entity.name AS entity__name,
|
|
||||||
entity.loginname AS entity__loginname,
|
|
||||||
entity.password AS entity__password,
|
|
||||||
entity.type AS entity__type,
|
|
||||||
entity.created AS entity__created,
|
|
||||||
entity.updated AS entity__updated,
|
|
||||||
entity.email_id AS entity__email_id,
|
|
||||||
entity_reference.entity1 AS entity_reference__entity1,
|
|
||||||
entity_reference.entity2 AS entity_reference__entity2
|
|
||||||
FROM entity
|
|
||||||
INNER JOIN entity_reference
|
|
||||||
ON entity.id = entity_reference.entity1
|
|
||||||
WHERE entity.id IN (SELECT entity2 FROM entity_reference WHERE entity1 IN (?))";
|
|
||||||
$stmt = $this->dbh->prepare($q);
|
$stmt = $this->dbh->prepare($q);
|
||||||
|
|
||||||
$stmt->execute(array(18));
|
$stmt->execute(array(18));
|
||||||
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
print_r($result);
|
||||||
|
*/
|
||||||
$this->connection->clear();
|
$this->connection->clear();
|
||||||
|
|
||||||
$e = $e->getTable()->find($e->id);
|
$e = $e->getTable()->find($e->id);
|
||||||
@ -95,7 +85,9 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
|
|||||||
|
|
||||||
$this->assertTrue($e->Entity[0] instanceof Entity);
|
$this->assertTrue($e->Entity[0] instanceof Entity);
|
||||||
$this->assertTrue($e->Entity[1] instanceof Entity);
|
$this->assertTrue($e->Entity[1] instanceof Entity);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$this->assertEqual(count($this->dbh), ($count + 1));
|
$this->assertEqual(count($this->dbh), ($count + 1));
|
||||||
|
|
||||||
$this->assertEqual($e->Entity[0]->name, "Friend 1");
|
$this->assertEqual($e->Entity[0]->name, "Friend 1");
|
||||||
@ -128,7 +120,9 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
|
|||||||
|
|
||||||
$this->assertEqual($coll->count(), 1);
|
$this->assertEqual($coll->count(), 1);
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
|
|
||||||
|
|
||||||
public function testToArray() {
|
public function testToArray() {
|
||||||
$user = new User();
|
$user = new User();
|
||||||
|
|
||||||
@ -923,6 +917,6 @@ class Doctrine_RecordTestCase extends Doctrine_UnitTestCase {
|
|||||||
$user = $this->connection->getTable("User")->find(4);
|
$user = $this->connection->getTable("User")->find(4);
|
||||||
$this->assertTrue($user->getIterator() instanceof ArrayIterator);
|
$this->assertTrue($user->getIterator() instanceof ArrayIterator);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user