summaryrefslogtreecommitdiff
path: root/framework/Data/ActiveRecord/TActiveRecord.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/Data/ActiveRecord/TActiveRecord.php')
-rw-r--r--framework/Data/ActiveRecord/TActiveRecord.php138
1 files changed, 71 insertions, 67 deletions
diff --git a/framework/Data/ActiveRecord/TActiveRecord.php b/framework/Data/ActiveRecord/TActiveRecord.php
index 4bbee046..544e9069 100644
--- a/framework/Data/ActiveRecord/TActiveRecord.php
+++ b/framework/Data/ActiveRecord/TActiveRecord.php
@@ -187,6 +187,7 @@ abstract class TActiveRecord extends TComponent
*/
public function __sleep()
{
+ $this->_connection=null;
return array_keys(get_object_vars($this));
}
@@ -226,7 +227,7 @@ abstract class TActiveRecord extends TComponent
*/
public function __get($name)
{
- if($this->hasRelation($name) && !$this->canGetProperty($name))
+ if($this->hasRecordRelation($name) && !$this->canGetProperty($name))
{
$this->fetchResultsFor($name);
return $this->$name;
@@ -244,7 +245,7 @@ abstract class TActiveRecord extends TComponent
*/
public function __set($name,$value)
{
- if($this->hasRelation($name) && !$this->canSetProperty($name))
+ if($this->hasRecordRelation($name) && !$this->canSetProperty($name))
$this->$name=$value;
else
parent::__set($name,$value);
@@ -282,16 +283,15 @@ abstract class TActiveRecord extends TComponent
/**
* Copies data from an array or another object.
* @throws TActiveRecordException if data is not array or not object.
- * @return TActiveRecord current instance.
*/
public function copyFrom($data)
{
- $data = is_object($data) ? get_object_vars($data) : $data;
+ if(is_object($data))
+ $data=get_object_vars($data);
if(!is_array($data))
- throw new TActiveRecordException('ar_must_copy_from_array_or_object', get_class($this));
+ throw new TActiveRecordException('ar_data_invalid', get_class($this));
foreach($data as $name=>$value)
$this->setColumnValue($name,$value);
- return $this;
}
/**
@@ -317,14 +317,14 @@ abstract class TActiveRecord extends TComponent
/**
* Compare two records using their primary key values (all column values if
* table does not defined primary keys). The default uses simple == for
- * comparison of their values. Set $strict=true for identity comparison.
+ * comparison of their values. Set $strict=true for identity comparison (===).
* @param TActiveRecord another record to compare with.
* @param boolean true to perform strict identity comparison
* @return boolean true if $record equals, false otherwise.
*/
public function equals(TActiveRecord $record, $strict=false)
{
- if($record===null)
+ if($record===null || get_class($this)!==get_class($record))
return false;
$tableInfo = $this->getRecordGateway()->getRecordTableInfo($this);
$pks = $tableInfo->getPrimaryKeys();
@@ -350,13 +350,9 @@ abstract class TActiveRecord extends TComponent
* event handlers to object instance.
* @param string active record class name.
* @return TActiveRecord active record finder instance.
- * @throws TActiveRecordException if class name equals 'TActiveRecord'.
*/
public static function finder($className=__CLASS__)
{
- if($className===__CLASS__)
- throw new TActiveRecordException('ar_invalid_finder_class_name');
-
static $finders = array();
if(!isset($finders[$className]))
{
@@ -372,7 +368,7 @@ abstract class TActiveRecord extends TComponent
* TActiveRecordManager::getInstance().
* @return TActiveRecordManager default active record manager.
*/
- public function getRecordManager()
+ public static function getRecordManager()
{
return TActiveRecordManager::getInstance();
}
@@ -380,9 +376,9 @@ abstract class TActiveRecord extends TComponent
/**
* @return TActiveRecordGateway record table gateway.
*/
- public function getRecordGateway()
+ public static function getRecordGateway()
{
- return $this->getRecordManager()->getRecordGateway();
+ return TActiveRecordManager::getInstance()->getRecordGateway();
}
/**
@@ -401,10 +397,12 @@ abstract class TActiveRecord extends TComponent
protected function commitChanges()
{
$gateway = $this->getRecordGateway();
+ /** Qiang: no need to check if it is view (developer should know that and an error will occur anyway)
if(!$this->_readOnly)
$this->_readOnly = $gateway->getRecordTableInfo($this)->getIsView();
+ */
if($this->_readOnly)
- throw new TActiveRecordException('ar_readonly_exception',get_class($this));
+ throw new TActiveRecordException('ar_read_only',get_class($this));
$param = new TActiveRecordChangeEventParameter();
switch($this->_objectState)
{
@@ -481,53 +479,57 @@ abstract class TActiveRecord extends TComponent
public function deleteAll($criteria=null, $parameters=array())
{
$args = func_num_args() > 1 ? array_slice(func_get_args(),1) : null;
- $criteria = $this->getCriteria($criteria,$parameters, $args);
+ $criteria = $this->getRecordCriteria($criteria,$parameters, $args);
return $this->getRecordGateway()->deleteRecordsByCriteria($this, $criteria);
}
/**
- * Populate the record with data, registers the object as clean.
- * @param string new record name
- * @param array name value pair record data
+ * Populate the record with the query result.
+ * @param array name value pair of record data
* @return TActiveRecord object record, null if data is empty.
*/
- protected function populateObject($type, $data)
- {
- if(empty($data))
- return null;
- $obj = self::createRecordInstance($type, $data, self::STATE_LOADED);
- return $obj;
- }
-
- /**
- * Create an instance of ActiveRecord class given by $type.
- * This static method should only be used internally within core ActiveRecord classes.
- */
- public static function createRecordInstance($type, $data=array(), $state=self::STATE_NEW)
+ protected function populateObject($data)
{
- $obj = Prado::createComponent($type);
- $obj->_objectState=$state;
- $tableInfo = $obj->getRecordGateway()->getRecordTableInfo($obj);
- $obj->_readOnly=$tableInfo->getIsView();
- if(!empty($data))
- $obj->copyFrom($data);
- return $obj;
+ return self::createRecordInstance(get_class($this), $data);
}
/**
* @param TDbDataReader data reader
- * @return array
+ * @return array the AR objects populated by the query result
*/
- protected function collectObjects($reader)
+ protected function populateObjects($reader)
{
$result=array();
$class = get_class($this);
foreach($reader as $data)
- $result[] = $this->populateObject($class, $data);
+ $result[] = self::createRecordInstance($class, $data);
return $result;
}
/**
+ * Create an AR instance specified by the AR class name and initial data.
+ * If the initial data is empty, the AR object will not be created and null will be returned.
+ * (You should use the "new" operator to create the AR instance in that case.)
+ * @param string the AR class name
+ * @param array initial data to be populated into the AR object.
+ * @param integer the AR object state
+ * @return TActiveRecord the initialized AR object. Null if the initial data is empty.
+ */
+ public static function createRecordInstance($type, $data, $state=self::STATE_LOADED)
+ {
+ if(empty($data))
+ return null;
+ $record=new $type($data);
+ $record->_objectState=$state;
+ /** Qiang: no need to check if it is a view
+ $tableInfo = $record->getRecordGateway()->getRecordTableInfo($obj);
+ $record->_readOnly=$tableInfo->getIsView();
+ */
+ $record->copyFrom($data);
+ return $record;
+ }
+
+ /**
* Find one single record that matches the criteria.
*
* Usage:
@@ -547,9 +549,9 @@ abstract class TActiveRecord extends TComponent
public function find($criteria,$parameters=array())
{
$args = func_num_args() > 1 ? array_slice(func_get_args(),1) : null;
- $criteria = $this->getCriteria($criteria,$parameters, $args);
+ $criteria = $this->getRecordCriteria($criteria,$parameters, $args);
$data = $this->getRecordGateway()->findRecordsByCriteria($this,$criteria);
- return $this->populateObject(get_class($this), $data);
+ return $this->populateObject($data);
}
/**
@@ -563,9 +565,9 @@ abstract class TActiveRecord extends TComponent
{
$args = func_num_args() > 1 ? array_slice(func_get_args(),1) : null;
if($criteria!==null)
- $criteria = $this->getCriteria($criteria,$parameters, $args);
+ $criteria = $this->getRecordCriteria($criteria,$parameters, $args);
$result = $this->getRecordGateway()->findRecordsByCriteria($this,$criteria,true);
- return $this->collectObjects($result);
+ return $this->populateObjects($result);
}
/**
@@ -585,7 +587,7 @@ abstract class TActiveRecord extends TComponent
if(func_num_args() > 1)
$keys = func_get_args();
$data = $this->getRecordGateway()->findRecordByPK($this,$keys);
- return $this->populateObject(get_class($this), $data);
+ return $this->populateObject($data);
}
/**
@@ -610,7 +612,7 @@ abstract class TActiveRecord extends TComponent
if(func_num_args() > 1)
$keys = func_get_args();
$result = $this->getRecordGateway()->findRecordsByPks($this,(array)$keys);
- return $this->collectObjects($result);
+ return $this->populateObjects($result);
}
/**
@@ -624,9 +626,9 @@ abstract class TActiveRecord extends TComponent
public function findBySql($sql,$parameters=array())
{
$args = func_num_args() > 1 ? array_slice(func_get_args(),1) : null;
- $criteria = $this->getCriteria($sql,$parameters, $args);
+ $criteria = $this->getRecordCriteria($sql,$parameters, $args);
$data = $this->getRecordGateway()->findRecordBySql($this,$criteria);
- return $this->populateObject(get_class($this), $data);
+ return $this->populateObject($data);
}
/**
@@ -640,9 +642,9 @@ abstract class TActiveRecord extends TComponent
public function findAllBySql($sql,$parameters=array())
{
$args = func_num_args() > 1 ? array_slice(func_get_args(),1) : null;
- $criteria = $this->getCriteria($sql,$parameters, $args);
+ $criteria = $this->getRecordCriteria($sql,$parameters, $args);
$result = $this->getRecordGateway()->findRecordsBySql($this,$criteria);
- return $this->collectObjects($result);
+ return $this->populateObjects($result);
}
/**
@@ -660,7 +662,7 @@ abstract class TActiveRecord extends TComponent
public function findAllByIndex($criteria,$fields,$values)
{
$result = $this->getRecordGateway()->findRecordsByIndex($this,$criteria,$fields,$values);
- return $this->collectObjects($result);
+ return $this->populateObjects($result);
}
/**
@@ -673,7 +675,7 @@ abstract class TActiveRecord extends TComponent
{
$args = func_num_args() > 1 ? array_slice(func_get_args(),1) : null;
if($criteria!==null)
- $criteria = $this->getCriteria($criteria,$parameters, $args);
+ $criteria = $this->getRecordCriteria($criteria,$parameters, $args);
return $this->getRecordGateway()->countRecords($this,$criteria);
}
@@ -686,9 +688,9 @@ abstract class TActiveRecord extends TComponent
*/
protected function getRelationHandler($name,$args=array())
{
- if(($context=$this->getRelationContext($name)) !== null)
+ if(($context=$this->createRelationContext($name)) !== null)
{
- $criteria = $this->getCriteria(count($args)>0 ? $args[0] : null, array_slice($args,1));
+ $criteria = $this->getRecordCriteria(count($args)>0 ? $args[0] : null, array_slice($args,1));
return $context->getRelationHandler($criteria);
}
else
@@ -704,10 +706,13 @@ abstract class TActiveRecord extends TComponent
* the active record relationships for given property, null if invalid relationship
* @since 3.1.2
*/
- protected function getRelationContext($name)
+ protected function createRelationContext($name)
{
- if(list($property, $relation) = $this->getRelation($name))
+ if(($definition=$this->getRecordRelation($name))!==null)
+ {
+ list($property, $relation) = $definition;
return new TActiveRecordRelationContext($this,$property,$relation);
+ }
else
return null;
}
@@ -749,7 +754,7 @@ abstract class TActiveRecord extends TComponent
*/
protected function fetchResultsFor($property)
{
- if( ($context=$this->getRelationContext($property)) !== null)
+ if( ($context=$this->createRelationContext($property)) !== null)
return $context->getRelationHandler()->fetchResultsInto($this);
else
return false;
@@ -819,7 +824,7 @@ abstract class TActiveRecord extends TComponent
* @param array additional parameters obtained from function_get_args().
* @return TSqlCriteria criteria object.
*/
- protected function getCriteria($criteria, $parameters, $args=array())
+ protected function getRecordCriteria($criteria, $parameters, $args=array())
{
if(is_string($criteria))
{
@@ -878,7 +883,7 @@ abstract class TActiveRecord extends TComponent
/**
* Raised before the record attempt to delete its data from the database.
- * To prevent the insert operation, set the TActiveRecordChangeEventParameter::IsValid parameter to false.
+ * To prevent the delete operation, set the TActiveRecordChangeEventParameter::IsValid parameter to false.
* @param TActiveRecordChangeEventParameter event parameter to be passed to the event handlers
*/
public function onDelete($param)
@@ -888,7 +893,7 @@ abstract class TActiveRecord extends TComponent
/**
* Raised before the record attempt to update its data in the database.
- * To prevent the insert operation, set the TActiveRecordChangeEventParameter::IsValid parameter to false.
+ * To prevent the update operation, set the TActiveRecordChangeEventParameter::IsValid parameter to false.
* @param TActiveRecordChangeEventParameter event parameter to be passed to the event handlers
*/
public function onUpdate($param)
@@ -931,7 +936,7 @@ abstract class TActiveRecord extends TComponent
* @return array relation definition for the specified property
* @since 3.1.2
*/
- public function getRelation($property)
+ public function getRecordRelation($property)
{
$className=get_class($this);
$property=strtolower($property);
@@ -942,7 +947,7 @@ abstract class TActiveRecord extends TComponent
* @return array all relation definitions declared in the AR class
* @since 3.1.2
*/
- public function getRelations()
+ public function getRecordRelations()
{
return self::$_relations[get_class($this)];
}
@@ -952,7 +957,7 @@ abstract class TActiveRecord extends TComponent
* @return boolean whether a relation is declared for the specified AR property
* @since 3.1.2
*/
- public function hasRelation($property)
+ public function hasRecordRelation($property)
{
return isset(self::$_relations[get_class($this)][strtolower($property)]);
}
@@ -972,7 +977,6 @@ abstract class TActiveRecord extends TComponent
* @package System.Data.ActiveRecord
* @since 3.1.2
*/
-
class TActiveRecordChangeEventParameter extends TEventParameter
{
private $_isValid=true;