Browse Source

AR WIP

tags/2.0.0-beta
Qiang Xue 12 years ago
parent
commit
36f7302515
  1. 51
      framework/db/ar/ActiveRecord.php
  2. 9
      framework/db/ar/ActiveRelation.php

51
framework/db/ar/ActiveRecord.php

@ -44,10 +44,6 @@ use yii\util\StringHelper;
abstract class ActiveRecord extends Model abstract class ActiveRecord extends Model
{ {
/** /**
* @var ActiveRecord[] global model instances indexed by model class names
*/
private static $_models = array();
/**
* @var array attribute values indexed by attribute names * @var array attribute values indexed by attribute names
*/ */
private $_attributes = array(); private $_attributes = array();
@ -55,20 +51,11 @@ abstract class ActiveRecord extends Model
* @var array old attribute values indexed by attribute names. * @var array old attribute values indexed by attribute names.
*/ */
private $_oldAttributes; private $_oldAttributes;
/** /**
* Returns a model instance to support accessing non-static methods such as [[table()]], [[primaryKey()]]. * @var array related models indexed by the relation names
* @return ActiveRecord
*/ */
public static function model() private $_related;
{
$className = get_called_class();
if (!isset(self::$_models[$className])) {
self::$_models[$className] = new static;
}
return self::$_models[$className];
}
/** /**
* Returns the database connection used by this AR class. * Returns the database connection used by this AR class.
@ -87,7 +74,7 @@ abstract class ActiveRecord extends Model
* Because [[ActiveQuery]] implements a set of query building methods, * Because [[ActiveQuery]] implements a set of query building methods,
* additional query conditions can be specified by calling the methods of [[ActiveQuery]]. * additional query conditions can be specified by calling the methods of [[ActiveQuery]].
* *
* Below are some usage examples: * Below are some examples:
* *
* ~~~ * ~~~
* // find all customers * // find all customers
@ -110,7 +97,8 @@ abstract class ActiveRecord extends Model
* *
* @param mixed $q the query parameter. This can be one of the followings: * @param mixed $q the query parameter. This can be one of the followings:
* *
* - a scalar value (integer or string): query by a single primary key value. * - a scalar value (integer or string): query by a single primary key value and return the
* corresponding record.
* - an array of name-value pairs: it will be used to configure the [[ActiveQuery]] object. * - an array of name-value pairs: it will be used to configure the [[ActiveQuery]] object.
* *
* @return ActiveQuery|ActiveRecord|null the [[ActiveQuery]] instance for query purpose, or * @return ActiveQuery|ActiveRecord|null the [[ActiveQuery]] instance for query purpose, or
@ -119,14 +107,14 @@ abstract class ActiveRecord extends Model
*/ */
public static function find($q = null) public static function find($q = null)
{ {
$query = static::createActiveQuery(); $query = static::createQuery();
if (is_array($q)) { if (is_array($q)) {
foreach ($q as $name => $value) { foreach ($q as $name => $value) {
$query->$name = $value; $query->$name = $value;
} }
} elseif ($q !== null) { } elseif ($q !== null) {
// query by primary key // query by primary key
$primaryKey = static::model()->primaryKey(); $primaryKey = static::primaryKey();
return $query->where(array($primaryKey[0] => $q))->one(); return $query->where(array($primaryKey[0] => $q))->one();
} }
return $query; return $query;
@ -143,7 +131,7 @@ abstract class ActiveRecord extends Model
*/ */
public static function findBySql($sql, $params = array()) public static function findBySql($sql, $params = array())
{ {
$query = static::createActiveQuery(); $query = static::createQuery();
$query->sql = $sql; $query->sql = $sql;
return $query->params($params); return $query->params($params);
} }
@ -177,7 +165,7 @@ abstract class ActiveRecord extends Model
*/ */
public static function count($q = null) public static function count($q = null)
{ {
$query = static::createActiveQuery(); $query = static::createQuery();
if (is_array($q)) { if (is_array($q)) {
foreach ($q as $name => $value) { foreach ($q as $name => $value) {
$query->$name = $value; $query->$name = $value;
@ -201,7 +189,7 @@ abstract class ActiveRecord extends Model
public static function updateAll($attributes, $condition = '', $params = array()) public static function updateAll($attributes, $condition = '', $params = array())
{ {
$query = new Query; $query = new Query;
$query->update(static::model()->tableName(), $attributes, $condition, $params); $query->update(static::tableName(), $attributes, $condition, $params);
return $query->createCommand(static::getDbConnection())->execute(); return $query->createCommand(static::getDbConnection())->execute();
} }
@ -222,7 +210,7 @@ abstract class ActiveRecord extends Model
$counters[$name] = new Expression($value >= 0 ? "$quotedName+$value" : "$quotedName$value"); $counters[$name] = new Expression($value >= 0 ? "$quotedName+$value" : "$quotedName$value");
} }
$query = new Query; $query = new Query;
$query->update(static::model()->tableName(), $counters, $condition, $params); $query->update(static::tableName(), $counters, $condition, $params);
return $query->createCommand($db)->execute(); return $query->createCommand($db)->execute();
} }
@ -236,7 +224,7 @@ abstract class ActiveRecord extends Model
public static function deleteAll($condition = '', $params = array()) public static function deleteAll($condition = '', $params = array())
{ {
$query = new Query; $query = new Query;
$query->delete(static::model()->tableName(), $condition, $params); $query->delete(static::tableName(), $condition, $params);
return $query->createCommand(static::getDbConnection())->execute(); return $query->createCommand(static::getDbConnection())->execute();
} }
@ -245,7 +233,7 @@ abstract class ActiveRecord extends Model
* This method is called by [[find()]] and [[findBySql()]] to start a SELECT query. * This method is called by [[find()]] and [[findBySql()]] to start a SELECT query.
* @return ActiveQuery the newly created [[ActiveQuery]] instance. * @return ActiveQuery the newly created [[ActiveQuery]] instance.
*/ */
public static function createActiveQuery() public static function createQuery()
{ {
return new ActiveQuery(array('modelClass' => get_called_class())); return new ActiveQuery(array('modelClass' => get_called_class()));
} }
@ -312,6 +300,7 @@ abstract class ActiveRecord extends Model
return null; return null;
} elseif (method_exists($this, $name)) { } elseif (method_exists($this, $name)) {
// lazy loading related records // lazy loading related records
/** @var $query ActiveRelation */
$query = $this->$name(); $query = $this->$name();
return $this->_attributes[$name] = $query->multiple ? $query->all() : $query->one(); return $this->_attributes[$name] = $query->multiple ? $query->all() : $query->one();
} else { } else {
@ -465,7 +454,7 @@ abstract class ActiveRecord extends Model
/** /**
* Returns the list of all attribute names of the model. * Returns the list of all attribute names of the model.
* This would return all column names of the table associated with this AR class. * The default implementation will return all column names of the table associated with this AR class.
* @return array list of attribute names. * @return array list of attribute names.
*/ */
public function attributes() public function attributes()
@ -501,6 +490,12 @@ abstract class ActiveRecord extends Model
$this->_attributes[$name] = $value; $this->_attributes[$name] = $value;
} }
/**
* Returns the attribute values that have been modified since they are loaded or saved most recently.
* @param string[]|null $names the names of the attributes whose values may be returned if they are
* changed recently. If null, [[attributes()]] will be used.
* @return array the changed attribute values (name-value pairs)
*/
public function getChangedAttributes($names = null) public function getChangedAttributes($names = null)
{ {
if ($names === null) { if ($names === null) {
@ -904,4 +899,6 @@ abstract class ActiveRecord extends Model
{ {
return $this->__isset($offset); return $this->__isset($offset);
} }
} }

9
framework/db/ar/ActiveRelation.php

@ -47,9 +47,16 @@ class ActiveRelation extends BaseActiveQuery
*/ */
public $via; public $via;
public function get() public function one()
{ {
$models = $this->all();
return isset($models[0]) ? $models[0] : null;
}
public function all()
{
$models = array();
return $models;
} }
public function findWith($name, &$primaryRecords) public function findWith($name, &$primaryRecords)

Loading…
Cancel
Save