From ea0601cdd4a732fc15b83104a47788989bb004b3 Mon Sep 17 00:00:00 2001
From: wei <>
Date: Mon, 30 Apr 2007 03:44:49 +0000
Subject: Reverted TActiveRecord::populateObject to protected
---
.../Relations/TActiveRecordBelongsTo.php | 68 +++++++++++++++++++++-
.../Relations/TActiveRecordHasMany.php | 16 ++---
.../ActiveRecord/Relations/TActiveRecordHasOne.php | 31 +++++++++-
.../Relations/TActiveRecordRelation.php | 47 +++++++++++----
.../Relations/TActiveRecordRelationContext.php | 60 +++++++++++++++++++
framework/Data/ActiveRecord/TActiveRecord.php | 36 ++++++------
.../ActiveRecord/TActiveRecordStateRegistry.php | 4 +-
7 files changed, 214 insertions(+), 48 deletions(-)
(limited to 'framework/Data')
diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordBelongsTo.php b/framework/Data/ActiveRecord/Relations/TActiveRecordBelongsTo.php
index 3bb1a74b..c72ba160 100644
--- a/framework/Data/ActiveRecord/Relations/TActiveRecordBelongsTo.php
+++ b/framework/Data/ActiveRecord/Relations/TActiveRecordBelongsTo.php
@@ -1,7 +1,71 @@
-
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright © 2005-2007 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Id$
+ * @package System.Data.ActiveRecord.Relations
+ */
+/**
+ * Loads base active record relationship class.
+ */
Prado::using('System.Data.ActiveRecord.Relations.TActiveRecordRelation');
+/**
+ * Implements the foreign key relationship (TActiveRecord::BELONGS_TO) between
+ * the source objects and the related foreign object. Consider the
+ * entity relationship between a Team and a Player.
+ *
+ * +------+ +--------+
+ * | Team | 1 <----- * | Player |
+ * +------+ +--------+
+ *
+ * Where one team may have 0 or more players and each player belongs to only
+ * one team. We may model Team-Player object relationship as active record as follows.
+ *
+ * class TeamRecord extends TActiveRecord
+ * {
+ * // see TActiveRecordHasMany for detailed definition.
+ * }
+ * class PlayerRecord extends TActiveRecord
+ * {
+ * const TABLE='player';
+ * public $player_id; //primary key
+ * public $team_name; //foreign key player.team_name <-> team.name
+ * public $age;
+ * public $team; //foreign object TeamRecord
+ *
+ * protected static $RELATIONS = array(
+ * 'team' => array(self::BELONGS_TO, 'TeamRecord'));
+ *
+ * public static function finder($className=__CLASS__)
+ * {
+ * return parent::finder($className);
+ * }
+ * }
+ *
+ * The $RELATIONS static property of PlayerRecord defines that the
+ * property $team belongs to (or is a) TeamRecords.
+ *
+ * The team object may be fetched as follows.
+ *
+ * $players = PlayerRecord::finder()->with_team()->findAll();
+ *
+ * The method with_xxx() (where xxx is the relationship property
+ * name, in this case, team) fetchs the corresponding TeamRecords using
+ * a second query (not by using a join). The with_xxx() accepts the same
+ * arguments as other finder methods of TActiveRecord, e.g.
+ * with_team('location = ?', 'Madrid').
+ *
+ * @author Wei Zhuo
+ * @version $Id$
+ * @package System.Data.ActiveRecord.Relations
+ * @since 3.1
+ */
class TActiveRecordBelongsTo extends TActiveRecordRelation
{
/**
@@ -39,5 +103,5 @@ class TActiveRecordBelongsTo extends TActiveRecordRelation
}
}
}
-
+
?>
\ No newline at end of file
diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordHasMany.php b/framework/Data/ActiveRecord/Relations/TActiveRecordHasMany.php
index 27ffd194..795630ab 100644
--- a/framework/Data/ActiveRecord/Relations/TActiveRecordHasMany.php
+++ b/framework/Data/ActiveRecord/Relations/TActiveRecordHasMany.php
@@ -17,14 +17,14 @@ Prado::using('System.Data.ActiveRecord.Relations.TActiveRecordRelation');
/**
* Implements TActiveRecord::HAS_MANY relationship between the source object having zero or
- * more foreign objects. Consider the relationship between a Team and a Player.
+ * more foreign objects. Consider the entity relationship between a Team and a Player.
*
* +------+ +--------+
- * | Team | 1 -----> * | Player |
+ * | Team | 1 <----- * | Player |
* +------+ +--------+
*
* Where one team may have 0 or more players and each player belongs to only
- * one team. We may model Team-Player relationship as active record as follows.
+ * one team. We may model Team-Player object relationship as active record as follows.
*
* class TeamRecord extends TActiveRecord
* {
@@ -44,15 +44,7 @@ Prado::using('System.Data.ActiveRecord.Relations.TActiveRecordRelation');
* }
* class PlayerRecord extends TActiveRecord
* {
- * const TABLE='player';
- * public $player_id; //primary key
- * public $team_name; //foreign key player.team_name <-> team.name
- * public $age;
- *
- * public static function finder($className=__CLASS__)
- * {
- * return parent::finder($className);
- * }
+ * // see TActiveRecordBelongsTo for detailed definition
* }
*
* The $RELATIONS static property of TeamRecord defines that the
diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordHasOne.php b/framework/Data/ActiveRecord/Relations/TActiveRecordHasOne.php
index 048f776b..e8c2ccee 100644
--- a/framework/Data/ActiveRecord/Relations/TActiveRecordHasOne.php
+++ b/framework/Data/ActiveRecord/Relations/TActiveRecordHasOne.php
@@ -1,6 +1,33 @@
-
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright © 2005-2007 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Id$
+ * @package System.Data.ActiveRecord.Relations
+ */
+
+/**
+ * Loads base active record relationship class.
+ */
Prado::using('System.Data.ActiveRecord.Relations.TActiveRecordRelation');
+/**
+ * TActiveRecordHasOne models the object relationship that a record (the source object)
+ * property is an instance of foreign record object having a foreign key
+ * related to the source object.
+ *
+ *
+ *
+ *
+ * @author Wei Zhuo
+ * @version $Id$
+ * @package System.Data.ActiveRecord.Relations
+ * @since 3.1
+ */
class TActiveRecordHasOne extends TActiveRecordRelation
{
/**
@@ -38,5 +65,5 @@ class TActiveRecordHasOne extends TActiveRecordRelation
}
}
}
-
+
?>
\ No newline at end of file
diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordRelation.php b/framework/Data/ActiveRecord/Relations/TActiveRecordRelation.php
index f1e8fa60..38455309 100644
--- a/framework/Data/ActiveRecord/Relations/TActiveRecordRelation.php
+++ b/framework/Data/ActiveRecord/Relations/TActiveRecordRelation.php
@@ -1,6 +1,30 @@
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright © 2005-2007 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Id$
+ * @package System.Data.ActiveRecord.Relations
+ */
+
+/**
+ * Load active record relationship context.
+ */
Prado::using('System.Data.ActiveRecord.Relations.TActiveRecordRelationContext');
+/**
+ * Base class for active record relationships.
+ *
+ * description
+ *
+ * @author Wei Zhuo
+ * @version $Id$
+ * @package System.Data.ActiveRecord.Relations
+ * @since 3.1
+ */
abstract class TActiveRecordRelation
{
private $_context;
@@ -28,11 +52,10 @@ abstract class TActiveRecordRelation
/**
* Dispatch the method calls to the source record finder object. When
- * the results are returned as array or is an instance of TActiveRecord we
- * will fetch the corresponding foreign objects with an sql query and populate
- * the results obtained earlier.
+ * an instance of TActiveRecord or an array of TActiveRecord is returned
+ * the corresponding foreign objects are also fetched and assigned.
*
- * Allows chaining multiple relation handlers.
+ * Multiple relationship calls can be chain together.
*
* @param string method name called
* @param array method arguments
@@ -106,7 +129,7 @@ abstract class TActiveRecordRelation
/**
* Obtain the foreign key index values from the results.
* @param array property names
- * @param array|TActiveRecord TActiveRecord results
+ * @param array TActiveRecord results
* @return array foreign key index values.
*/
protected function getIndexValues($keys, $results)
@@ -134,14 +157,16 @@ abstract class TActiveRecordRelation
{
$collections=array();
foreach($fkObjects as $fkObject)
- {
- $hash = $this->getObjectHash($fkObject, $fields);
- $collections[$hash][]=$fkObject;
- }
-
+ $collections[$this->getObjectHash($fkObject, $fields)][]=$fkObject;
$this->setResultCollection($results, $collections, $properties);
}
+ /**
+ * Populates the result array with foreign objects (matched using foreign key hashed property values).
+ * @param array $results
+ * @param array $collections
+ * @param array property names
+ */
protected function setResultCollection(&$results, &$collections, $properties)
{
if(is_array($results))
@@ -150,9 +175,7 @@ abstract class TActiveRecordRelation
$this->setObjectProperty($results[$i], $properties, $collections);
}
else
- {
$this->setObjectProperty($results, $properties, $collections);
- }
}
/**
diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordRelationContext.php b/framework/Data/ActiveRecord/Relations/TActiveRecordRelationContext.php
index 03dc4cd5..a33e105e 100644
--- a/framework/Data/ActiveRecord/Relations/TActiveRecordRelationContext.php
+++ b/framework/Data/ActiveRecord/Relations/TActiveRecordRelationContext.php
@@ -1,7 +1,33 @@
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright © 2005-2007 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Id$
+ * @package System.Data.ActiveRecord.Relations
+ */
+/**
+ * TActiveRecordRelationContext holds information regarding record relationships
+ * such as record relation property name, query criteria and foreign object record
+ * class names.
+ *
+ * This class is use internally by passing a context to the TActiveRecordRelation
+ * constructor.
+ *
+ * @author Wei Zhuo
+ * @version $Id$
+ * @package System.Data.ActiveRecord.Relations
+ * @since 3.1
+ */
class TActiveRecordRelationContext
{
+ /**
+ * static property name in TActiveRecord that defines the record relationships.
+ */
const RELATIONS_CONST = 'RELATIONS';
private $_property;
@@ -16,9 +42,13 @@ class TActiveRecordRelationContext
$this->_criteria=$criteria;
$this->_relation = $this->getSourceRecordRelation($property);
}
+
/**
+ * Uses ReflectionClass to obtain the relation details array of a given
+ * property from the $RELATIONS static property in TActiveRecord.
* @param string relation property name
* @return array relation definition.
+ * @throws TActiveRecordException if property is not defined or missing.
*/
protected function getSourceRecordRelation($property)
{
@@ -34,46 +64,76 @@ class TActiveRecordRelationContext
$property, get_class($this->_sourceRecord), self::RELATIONS_CONST);
}
+ /**
+ * @return string name of the record property that the relationship results will be assigned to.
+ */
public function getProperty()
{
return $this->_property;
}
+ /**
+ * @return TActiveRecordCriteria sql query criteria for fetching the related record.
+ */
public function getCriteria()
{
return $this->_criteria;
}
+ /**
+ * @return TActiveRecord the active record instance that queried for its related records.
+ */
public function getSourceRecord()
{
return $this->_sourceRecord;
}
+ /**
+ * @return string foreign record class name.
+ */
public function getForeignRecordClass()
{
return $this->_relation[1];
}
+ /**
+ * @return string HAS_MANY, HAS_ONE, or BELONGS_TO
+ */
public function getRelationType()
{
return $this->_relation[0];
}
+ /**
+ * @return string the M-N relationship association table name.
+ */
public function getAssociationTable()
{
return $this->_relation[2];
}
+ /**
+ * @return boolean true if the relationship is HAS_MANY and requires an association table.
+ */
public function hasAssociationTable()
{
return isset($this->_relation[2]);
}
+ /**
+ * @return TActiveRecord corresponding relationship foreign object finder instance.
+ */
public function getForeignRecordFinder()
{
return TActiveRecord::finder($this->getForeignRecordClass());
}
+ /**
+ * Creates and return the TActiveRecordRelation handler for specific relationships.
+ * An instance of TActiveRecordHasOne, TActiveRecordBelongsTo, TActiveRecordHasMany,
+ * or TActiveRecordHasManyAssocation will be returned.
+ * @return TActiveRecordRelation record relationship handler instnace.
+ */
public function getRelationHandler()
{
switch($this->getRelationType())
diff --git a/framework/Data/ActiveRecord/TActiveRecord.php b/framework/Data/ActiveRecord/TActiveRecord.php
index 67057554..2ff3f1d4 100644
--- a/framework/Data/ActiveRecord/TActiveRecord.php
+++ b/framework/Data/ActiveRecord/TActiveRecord.php
@@ -10,9 +10,9 @@
* @package System.Data.ActiveRecord
*/
-/**
- * Load record manager, criteria and relations.
- */
+/**
+ * Load record manager, criteria and relations.
+ */
Prado::using('System.Data.ActiveRecord.TActiveRecordManager');
Prado::using('System.Data.ActiveRecord.TActiveRecordCriteria');
Prado::using('System.Data.ActiveRecord.Relations.TActiveRecordRelationContext');
@@ -282,7 +282,7 @@ abstract class TActiveRecord extends TComponent
* @param array name value pair record data
* @return TActiveRecord object record, null if data is empty.
*/
- public function populateObject($type, $data)
+ protected function populateObject($type, $data)
{
if(empty($data)) return null;
$registry = $this->getRecordManager()->getObjectStateRegistry();
@@ -311,7 +311,7 @@ abstract class TActiveRecord extends TComponent
/**
* @param TDbDataReader data reader
*/
- public function collectObjects($reader)
+ protected function collectObjects($reader)
{
$result=array();
$class = get_class($this);
@@ -428,14 +428,14 @@ abstract class TActiveRecord extends TComponent
}
/**
- * Fetches records using the sql clause "(fields) IN (values)", where
- * fields is an array of column names and values is an array of values that
- * the columns must have.
- *
- * This method is to be used by the relationship handler.
- *
- * @param TActiveRecordCriteria additional criteria
- * @param array field names to match with "(fields) IN (values)" sql clause.
+ * Fetches records using the sql clause "(fields) IN (values)", where
+ * fields is an array of column names and values is an array of values that
+ * the columns must have.
+ *
+ * This method is to be used by the relationship handler.
+ *
+ * @param TActiveRecordCriteria additional criteria
+ * @param array field names to match with "(fields) IN (values)" sql clause.
* @param array matching field values.
* @return array matching active records.
*/
@@ -461,17 +461,17 @@ abstract class TActiveRecord extends TComponent
return $gateway->countRecords($this,$criteria);
}
- /**
- * Returns the active record relationship handler for $RELATION with key
+ /**
+ * Returns the active record relationship handler for $RELATION with key
* value equal to the $property value.
- * @param string relationship property name.
+ * @param string relationship property name.
* @param array method call arguments.
* @return TActiveRecordRelation
*/
protected function getRelationHandler($property,$args)
{
- $criteria = $this->getCriteria(count($args)>0 ? $args[0] : null, array_slice($args,1));
- $context = new TActiveRecordRelationContext($this, $property, $criteria);
+ $criteria = $this->getCriteria(count($args)>0 ? $args[0] : null, array_slice($args,1));
+ $context = new TActiveRecordRelationContext($this, $property, $criteria);
return $context->getRelationHandler();
}
diff --git a/framework/Data/ActiveRecord/TActiveRecordStateRegistry.php b/framework/Data/ActiveRecord/TActiveRecordStateRegistry.php
index ef415b5e..691090dc 100644
--- a/framework/Data/ActiveRecord/TActiveRecordStateRegistry.php
+++ b/framework/Data/ActiveRecord/TActiveRecordStateRegistry.php
@@ -54,13 +54,13 @@ class TActiveRecordStateRegistry
* @param mixed row data fetched
* @return TActiveRecord cached object if found, null otherwise.
*/
- public function getCachedInstance($data)
+ public function getCachedInstance($data,$mustBeClean=true)
{
$key = $this->getObjectDataKey($data);
if(isset($this->_cachedObjects[$key]))
{
$obj = $this->_cachedObjects[$key];
- if($this->getIsCleanObject($obj))
+ if(!($mustBeClean && !$this->getIsCleanObject($obj)))
return $obj;
}
}
--
cgit v1.2.3