Tweaks to everything, refactoring hydrating.
This commit is contained in:
parent
d4e34979d1
commit
8c8d8187a5
@ -1134,7 +1134,9 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
|
|||||||
}
|
}
|
||||||
if ($deep) {
|
if ($deep) {
|
||||||
foreach ($this->_references as $key => $relation) {
|
foreach ($this->_references as $key => $relation) {
|
||||||
$a[$key] = $relation->toArray($deep, $prefixKey);
|
if (!$relation instanceof Doctrine_Null) {
|
||||||
|
$a[$key] = $relation->toArray($deep, $prefixKey);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return array_merge($a, $this->_values);
|
return array_merge($a, $this->_values);
|
||||||
|
@ -31,110 +31,5 @@
|
|||||||
* @link www.phpdoctrine.com
|
* @link www.phpdoctrine.com
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
class Doctrine_Resource_Access implements ArrayAccess
|
class Doctrine_Resource_Access extends Doctrine_Access
|
||||||
{
|
{ }
|
||||||
/**
|
|
||||||
* setArray
|
|
||||||
*
|
|
||||||
* @param array $array an array of key => value pairs
|
|
||||||
* @since 1.0
|
|
||||||
* @return Doctrine_Access
|
|
||||||
*/
|
|
||||||
public function setArray(array $array)
|
|
||||||
{
|
|
||||||
foreach ($array as $k=>$v) {
|
|
||||||
$this->set($k,$v);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* __set an alias of set()
|
|
||||||
*
|
|
||||||
* @see set, offsetSet
|
|
||||||
* @param $name
|
|
||||||
* @param $value
|
|
||||||
* @since 1.0
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __set($name,$value)
|
|
||||||
{
|
|
||||||
$this->set($name,$value);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* __get -- an alias of get()
|
|
||||||
*
|
|
||||||
* @see get, offsetGet
|
|
||||||
* @param mixed $name
|
|
||||||
* @since 1.0
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function __get($name)
|
|
||||||
{
|
|
||||||
return $this->get($name);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* __isset()
|
|
||||||
*
|
|
||||||
* @param string $name
|
|
||||||
* @since 1.0
|
|
||||||
* @return boolean whether or not this object contains $name
|
|
||||||
*/
|
|
||||||
public function __isset($name)
|
|
||||||
{
|
|
||||||
return $this->contains($name);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* __unset()
|
|
||||||
*
|
|
||||||
* @param string $name
|
|
||||||
* @since 1.0
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __unset($name)
|
|
||||||
{
|
|
||||||
return $this->remove($name);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param mixed $offset
|
|
||||||
* @return boolean whether or not this object contains $offset
|
|
||||||
*/
|
|
||||||
public function offsetExists($offset)
|
|
||||||
{
|
|
||||||
return $this->contains($offset);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* offsetGet an alias of get()
|
|
||||||
* @see get, __get
|
|
||||||
* @param mixed $offset
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function offsetGet($offset)
|
|
||||||
{
|
|
||||||
return $this->get($offset);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* sets $offset to $value
|
|
||||||
* @see set, __set
|
|
||||||
* @param mixed $offset
|
|
||||||
* @param mixed $value
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function offsetSet($offset, $value)
|
|
||||||
{
|
|
||||||
if ( ! isset($offset)) {
|
|
||||||
$this->add($value);
|
|
||||||
} else {
|
|
||||||
$this->set($offset, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* unset a given offset
|
|
||||||
* @see set, offsetSet, __set
|
|
||||||
* @param mixed $offset
|
|
||||||
*/
|
|
||||||
public function offsetUnset($offset)
|
|
||||||
{
|
|
||||||
return $this->remove($offset);
|
|
||||||
}
|
|
||||||
}
|
|
@ -64,7 +64,7 @@ class Doctrine_Resource_Client extends Doctrine_Resource
|
|||||||
$path = '/tmp/' . md5(serialize($this->getConfig()));
|
$path = '/tmp/' . md5(serialize($this->getConfig()));
|
||||||
$classesPath = $path.'.classes.php';
|
$classesPath = $path.'.classes.php';
|
||||||
|
|
||||||
if (!file_exists($path)) {
|
if (file_exists($path)) {
|
||||||
$schema = file_get_contents($path);
|
$schema = file_get_contents($path);
|
||||||
} else {
|
} else {
|
||||||
$request = new Doctrine_Resource_Request();
|
$request = new Doctrine_Resource_Request();
|
||||||
@ -74,7 +74,7 @@ class Doctrine_Resource_Client extends Doctrine_Resource
|
|||||||
$schema = $request->execute();
|
$schema = $request->execute();
|
||||||
|
|
||||||
if ($schema) {
|
if ($schema) {
|
||||||
file_put_contents($path, $schema);
|
file_put_contents($path, Doctrine_Parser::dump($schema, $this->getConfig()->get('format')));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,6 +86,8 @@ class Doctrine_Resource_Client extends Doctrine_Resource
|
|||||||
$build = "<?php\n";
|
$build = "<?php\n";
|
||||||
foreach ($schema['schema'] as $className => $details) {
|
foreach ($schema['schema'] as $className => $details) {
|
||||||
$build .= "class " . $className . " extends Doctrine_Resource_Record { protected \$_model = '".$className."'; public function __construct(\$loadRelations = true) { parent::__construct(\$this->_model, \$loadRelations); } }\n";
|
$build .= "class " . $className . " extends Doctrine_Resource_Record { protected \$_model = '".$className."'; public function __construct(\$loadRelations = true) { parent::__construct(\$this->_model, \$loadRelations); } }\n";
|
||||||
|
|
||||||
|
$schema['schema'][$className]['relations'] = isset($schema['relations'][$className]) ? $schema['relations'][$className]:array();
|
||||||
}
|
}
|
||||||
|
|
||||||
file_put_contents($classesPath, $build);
|
file_put_contents($classesPath, $build);
|
||||||
@ -99,6 +101,64 @@ class Doctrine_Resource_Client extends Doctrine_Resource
|
|||||||
|
|
||||||
public function getTable($table)
|
public function getTable($table)
|
||||||
{
|
{
|
||||||
return new Doctrine_Resource_Table($table);
|
static $instance;
|
||||||
|
|
||||||
|
if(!isset($instance[$table])) {
|
||||||
|
$instance[$table] = new Doctrine_Resource_Table($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $instance[$table];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function printSchema()
|
||||||
|
{
|
||||||
|
$schema = $this->getConfig('schema');
|
||||||
|
|
||||||
|
echo '<h2>Schema</h2>';
|
||||||
|
|
||||||
|
echo '<ul>';
|
||||||
|
|
||||||
|
foreach ($schema['schema'] as $className => $info) {
|
||||||
|
echo '<a name="'.$className.'"></a>';
|
||||||
|
echo '<li><h3>'.$className.'</h3></li>';
|
||||||
|
|
||||||
|
echo '<ul>';
|
||||||
|
echo '<li>Columns';
|
||||||
|
echo '<ul>';
|
||||||
|
foreach ($info['columns'] as $columnName => $column)
|
||||||
|
{
|
||||||
|
echo '<li>' . $columnName;
|
||||||
|
|
||||||
|
echo '<ul>';
|
||||||
|
foreach ($column as $key => $value) {
|
||||||
|
if ($value) {
|
||||||
|
echo '<li>'.$key.': '.$value.'</li>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo '</ul>';
|
||||||
|
|
||||||
|
echo '</li>';
|
||||||
|
}
|
||||||
|
echo '</ul>';
|
||||||
|
echo '</li>';
|
||||||
|
echo '</ul>';
|
||||||
|
|
||||||
|
if (isset($info['relations']) && !empty($info['relations'])) {
|
||||||
|
echo '<ul>';
|
||||||
|
echo '<li>Relations';
|
||||||
|
echo '<ul>';
|
||||||
|
foreach ($info['relations'] as $relationName => $relation)
|
||||||
|
{
|
||||||
|
echo '<li><a href="#'.$relation['class'].'">' . $relationName . '</a></li>';
|
||||||
|
}
|
||||||
|
echo '</ul>';
|
||||||
|
echo '</li>';
|
||||||
|
echo '</ul>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '</ul>';
|
||||||
|
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -36,12 +36,18 @@ class Doctrine_Resource_Collection extends Doctrine_Resource_Access implements C
|
|||||||
protected $_data = array();
|
protected $_data = array();
|
||||||
protected $_config = array();
|
protected $_config = array();
|
||||||
protected $_model = null;
|
protected $_model = null;
|
||||||
|
protected $_parent = null;
|
||||||
|
|
||||||
public function __construct($model)
|
public function __construct($model)
|
||||||
{
|
{
|
||||||
$this->_model = $model;
|
$this->_model = $model;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setParent($parent)
|
||||||
|
{
|
||||||
|
$this->_parent = $parent;
|
||||||
|
}
|
||||||
|
|
||||||
public function getConfig($key = null)
|
public function getConfig($key = null)
|
||||||
{
|
{
|
||||||
return Doctrine_Resource_Client::getInstance()->getConfig($key);
|
return Doctrine_Resource_Client::getInstance()->getConfig($key);
|
||||||
@ -52,16 +58,24 @@ class Doctrine_Resource_Collection extends Doctrine_Resource_Access implements C
|
|||||||
return count($this->_data);
|
return count($this->_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get($get)
|
public function get($key)
|
||||||
{
|
{
|
||||||
if (isset($this->_data[$get])) {
|
if (!$key || !isset($this->_data[$key])) {
|
||||||
return $this->_data[$get];
|
return $this->add();
|
||||||
|
} else {
|
||||||
|
return $this->_data[$key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function set($set, $value)
|
public function set($key, $value)
|
||||||
{
|
{
|
||||||
$this->_data[$set] = $value;
|
if (!$key || !isset($this->_data[$key])) {
|
||||||
|
$this->_data[$key] = $value;
|
||||||
|
} else {
|
||||||
|
$val = $this->add();
|
||||||
|
|
||||||
|
$val->_data[$key] = $value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function add($value = null)
|
public function add($value = null)
|
||||||
@ -69,7 +83,19 @@ class Doctrine_Resource_Collection extends Doctrine_Resource_Access implements C
|
|||||||
if (!$value) {
|
if (!$value) {
|
||||||
$model = $this->_model;
|
$model = $this->_model;
|
||||||
|
|
||||||
$value = new $model();
|
$value = new $model(false);
|
||||||
|
$table = $value->getTable();
|
||||||
|
$relation = $table->getRelationByClassName(get_class($this->_parent));
|
||||||
|
$alias = $relation['alias'];
|
||||||
|
|
||||||
|
if ($relation['type'] === Doctrine_Relation::ONE) {
|
||||||
|
$value->set($alias, $this->_parent);
|
||||||
|
} else {
|
||||||
|
$collection = new Doctrine_Resource_Collection($relation['class']);
|
||||||
|
$collection[] = $this->_parent;
|
||||||
|
|
||||||
|
$value->set($alias, $collection);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->_data[] = $value;
|
$this->_data[] = $value;
|
||||||
@ -87,13 +113,13 @@ class Doctrine_Resource_Collection extends Doctrine_Resource_Access implements C
|
|||||||
return isset($this->_data[0]) ? $this->_data[0]:null;
|
return isset($this->_data[0]) ? $this->_data[0]:null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function toArray()
|
public function toArray($deep = false)
|
||||||
{
|
{
|
||||||
$array = array();
|
$array = array();
|
||||||
|
|
||||||
foreach ($this->_data as $key => $record) {
|
foreach ($this->_data as $key => $record) {
|
||||||
if ($record->exists() || $record->hasChanges()) {
|
if ($record->exists() || $record->hasChanges()) {
|
||||||
$array[$this->_model . '_' .$key] = $record->toArray();
|
$array[$this->_model . '_' .$key] = $record->toArray($deep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,17 +57,22 @@ class Doctrine_Resource_Query
|
|||||||
$request->set('params', $params);
|
$request->set('params', $params);
|
||||||
$request->set('format', $this->getConfig()->get('format'));
|
$request->set('format', $this->getConfig()->get('format'));
|
||||||
$request->set('type', 'query');
|
$request->set('type', 'query');
|
||||||
|
$request->set('model', $this->getModel());
|
||||||
|
|
||||||
$response = $request->execute();
|
$response = $request->execute();
|
||||||
|
|
||||||
// If we have a response then lets parse it and hydrate it
|
// If we have a response then lets parse it and hydrate it
|
||||||
if ($response) {
|
if (!empty($response)) {
|
||||||
$array = Doctrine_Parser::load($response, $this->getConfig()->get('format'));
|
return $request->hydrate($response, $this->getModel());
|
||||||
|
|
||||||
return $request->hydrate($array, $this->getModel());
|
|
||||||
// Otherwise lets return an empty collection for the queried for model
|
// Otherwise lets return an empty collection for the queried for model
|
||||||
} else {
|
} else {
|
||||||
return new Doctrine_Resource_Collection($this->getModel());
|
$model = $this->getModel();
|
||||||
|
|
||||||
|
$collection = new Doctrine_Resource_Collection($this->getModel());
|
||||||
|
|
||||||
|
$collection[] = new $model(false);
|
||||||
|
|
||||||
|
return $collection;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,13 +35,11 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count
|
|||||||
{
|
{
|
||||||
protected $_data = array();
|
protected $_data = array();
|
||||||
protected $_model = null;
|
protected $_model = null;
|
||||||
protected $_table = null;
|
|
||||||
protected $_changes = array();
|
protected $_changes = array();
|
||||||
|
|
||||||
public function __construct($model, $loadRelations = true)
|
public function __construct($model, $loadRelations = true)
|
||||||
{
|
{
|
||||||
$this->_model = $model;
|
$this->_model = $model;
|
||||||
$this->_table = Doctrine_Resource_Client::getInstance()->getTable($model);
|
|
||||||
|
|
||||||
$this->initialize($loadRelations);
|
$this->initialize($loadRelations);
|
||||||
}
|
}
|
||||||
@ -74,6 +72,7 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count
|
|||||||
$this->_data[$relation['alias']] = new $relation['class'](false);
|
$this->_data[$relation['alias']] = new $relation['class'](false);
|
||||||
} else {
|
} else {
|
||||||
$this->_data[$relation['alias']] = new Doctrine_Resource_Collection($relation['class']);
|
$this->_data[$relation['alias']] = new Doctrine_Resource_Collection($relation['class']);
|
||||||
|
$this->_data[$relation['alias']]->setParent($this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -86,18 +85,65 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count
|
|||||||
|
|
||||||
public function get($key)
|
public function get($key)
|
||||||
{
|
{
|
||||||
|
if (!$key) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($this->_data[$key]) && $this->getTable()->hasRelation($key)) {
|
||||||
|
$this->_data[$key] = $this->createRelation($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!array_key_exists($key, $this->_data)) {
|
||||||
|
throw new Doctrine_Resource_Exception('Unknown property / related component: '.$key);
|
||||||
|
}
|
||||||
|
|
||||||
return $this->_data[$key];
|
return $this->_data[$key];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function set($key, $value)
|
public function set($key, $value)
|
||||||
{
|
{
|
||||||
if ($this->_data[$key] != $value) {
|
if (!$key) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($this->_data[$key]) && $this->getTable()->hasRelation($key)) {
|
||||||
|
$this->_data[$key] = $this->createRelation($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!array_key_exists($key, $this->_data)) {
|
||||||
|
throw new Doctrine_Resource_Exception('Unknown property / related component: '.$key);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->_data[$key] != $value && !$value instanceof Doctrine_Resource_Record && !$value instanceof Doctrine_Resource_Collection) {
|
||||||
$this->_changes[$key] = $value;
|
$this->_changes[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->_data[$key] = $value;
|
$this->_data[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function createRelation($key)
|
||||||
|
{
|
||||||
|
$relation = $this->getTable()->getRelation($key);
|
||||||
|
$class = $relation['class'];
|
||||||
|
|
||||||
|
if ($relation['type'] === Doctrine_Relation::ONE) {
|
||||||
|
$return = new $class(false);
|
||||||
|
$table = $return->getTable();
|
||||||
|
$returnRelation = $table->getRelationByClassName(get_class($this));
|
||||||
|
|
||||||
|
if ($returnRelation) {
|
||||||
|
$returnClass = new $returnRelation['class'](false);
|
||||||
|
|
||||||
|
$return->set($returnRelation['alias'], $returnClass);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$return = new Doctrine_Resource_Collection($class);
|
||||||
|
$return->setParent($this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
public function count()
|
public function count()
|
||||||
{
|
{
|
||||||
return count($this->_data);
|
return count($this->_data);
|
||||||
@ -108,8 +154,45 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count
|
|||||||
return new ArrayIterator($this->_data);
|
return new ArrayIterator($this->_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function sameAs(Doctrine_Resource_Record $record)
|
||||||
|
{
|
||||||
|
// If we have same class name
|
||||||
|
if (get_class($this) == get_class($record)) {
|
||||||
|
|
||||||
|
// If we have 2 records that exist and are persistant
|
||||||
|
if ($record->exists() && $this->exists()) {
|
||||||
|
if ($record->identifier() === $this->identifier()) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// If we have unsaved records then lets compare the data
|
||||||
|
} else {
|
||||||
|
if ($record->toArray(false) === $this->toArray(false)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function getChanges()
|
public function getChanges()
|
||||||
{
|
{
|
||||||
|
global $gotten;
|
||||||
|
|
||||||
|
if (!$gotten) {
|
||||||
|
$gotten = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$md5Hash = $this->getMd5Hash();
|
||||||
|
|
||||||
|
if (!in_array($md5Hash, $gotten)) {
|
||||||
|
$gotten[] = $md5Hash;
|
||||||
|
}
|
||||||
|
|
||||||
$array = array();
|
$array = array();
|
||||||
|
|
||||||
foreach ($this->_data as $key => $value) {
|
foreach ($this->_data as $key => $value) {
|
||||||
@ -117,13 +200,13 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count
|
|||||||
|
|
||||||
$relation = $this->getTable()->getRelation($key);
|
$relation = $this->getTable()->getRelation($key);
|
||||||
|
|
||||||
if ($relation['type'] === Doctrine_Relation::ONE) {
|
if ($value instanceof Doctrine_Resource_Record) {
|
||||||
if ($this->_data[$key]->hasChanges()) {
|
if ($value->hasChanges() && !in_array($value->getMd5Hash(), $gotten)) {
|
||||||
$array[$key] = $this->_data[$key]->getChanges();
|
$array[$key] = $value->getChanges();
|
||||||
}
|
}
|
||||||
} else {
|
} else if($value instanceof Doctrine_Resource_Collection) {
|
||||||
foreach ($this->_data[$key] as $key2 => $record) {
|
foreach ($value as $key2 => $record) {
|
||||||
if ($record->hasChanges()) {
|
if ($record->hasChanges() && !in_array($record->getMd5Hash(), $gotten)) {
|
||||||
$array[$key][$record->getModel() . '_' .$key2] = $record->getChanges();
|
$array[$key][$record->getModel() . '_' .$key2] = $record->getChanges();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -160,9 +243,9 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count
|
|||||||
|
|
||||||
$response = $request->execute();
|
$response = $request->execute();
|
||||||
|
|
||||||
$array = Doctrine_Parser::load($response, $format);
|
$this->_data = $request->hydrate(array($response), $this->_model, array($this))->getFirst()->_data;
|
||||||
|
|
||||||
$this->_data = $request->hydrate(array($array), $this->_model)->getFirst()->_data;
|
$this->clearChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete()
|
public function delete()
|
||||||
@ -180,7 +263,9 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count
|
|||||||
|
|
||||||
public function getTable()
|
public function getTable()
|
||||||
{
|
{
|
||||||
return $this->_table;
|
$model = $this->_model;
|
||||||
|
|
||||||
|
return Doctrine_Resource_Client::getInstance()->getTable($model);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getModel()
|
public function getModel()
|
||||||
@ -219,20 +304,38 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function toArray()
|
public function toArray($deep = false)
|
||||||
{
|
{
|
||||||
|
global $gotten;
|
||||||
|
|
||||||
|
if (!$gotten) {
|
||||||
|
$gotten = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$md5Hash = $this->getMd5Hash();
|
||||||
|
|
||||||
|
if (!in_array($md5Hash, $gotten)) {
|
||||||
|
$gotten[] = $md5Hash;
|
||||||
|
}
|
||||||
|
|
||||||
$array = array();
|
$array = array();
|
||||||
|
|
||||||
foreach ($this->_data as $key => $value) {
|
foreach ($this->_data as $key => $value) {
|
||||||
|
|
||||||
if ($this->getTable()->hasRelation($key) && $value instanceof Doctrine_Resource_Collection) {
|
if ($deep && $this->getTable()->hasRelation($key)) {
|
||||||
if ($value->count() > 0) {
|
if ($value instanceof Doctrine_Resource_Collection) {
|
||||||
$array[$key] = $value->toArray();
|
if ($value->count() > 0) {
|
||||||
}
|
foreach ($value as $key2 => $record) {
|
||||||
} else if ($this->getTable()->hasRelation($key) && $value instanceof Doctrine_Resource_Record) {
|
if (($record->exists() || $record->hasChanges()) && !in_array($record->getMd5Hash(), $gotten)) {
|
||||||
if ($value->exists() || $value->hasChanges()) {
|
$array[$key][get_class($record) . '_' . $key2] = $record->toArray($deep);
|
||||||
$array[$key] = $value->toArray();
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} else if ($value instanceof Doctrine_Resource_Record) {
|
||||||
|
if (($value->exists() || $value->hasChanges()) && !in_array($value->getMd5Hash(), $gotten)) {
|
||||||
|
$array[$key] = $value->toArray($deep);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (!$this->getTable()->hasRelation($key) && $this->getTable()->hasColumn($key)) {
|
} else if (!$this->getTable()->hasRelation($key) && $this->getTable()->hasColumn($key)) {
|
||||||
$array[$key] = $value;
|
$array[$key] = $value;
|
||||||
}
|
}
|
||||||
@ -240,4 +343,9 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count
|
|||||||
|
|
||||||
return $array;
|
return $array;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public function getMd5Hash()
|
||||||
|
{
|
||||||
|
return md5(serialize($this->_data));
|
||||||
|
}
|
||||||
|
}
|
@ -59,28 +59,67 @@ class Doctrine_Resource_Request extends Doctrine_Resource_Params
|
|||||||
|
|
||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
|
|
||||||
return $response;
|
$array = array();
|
||||||
}
|
|
||||||
|
if ($response) {
|
||||||
public function hydrate(array $array, $model, $passedKey = null)
|
$array = Doctrine_Parser::load($response, $this->getConfig()->get('format'));
|
||||||
{
|
|
||||||
if (empty($array)) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($array['error'])) {
|
||||||
|
throw new Doctrine_Resource_Exception($array['error']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hydrate(array $array, $model, $records = array())
|
||||||
|
{
|
||||||
$collection = new Doctrine_Resource_Collection($model);
|
$collection = new Doctrine_Resource_Collection($model);
|
||||||
|
|
||||||
foreach ($array as $record) {
|
foreach ($array as $recordKey => $record) {
|
||||||
$r = new $model();
|
if (isset($records[$recordKey])) {
|
||||||
|
$r = $records[$recordKey];
|
||||||
|
} else {
|
||||||
|
$r = new $model(false);
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($record as $key => $value) {
|
foreach ($record as $key => $value) {
|
||||||
if ($r->getTable()->hasRelation($key) && !empty($value)) {
|
if ($r->getTable()->hasRelation($key) && !empty($value)) {
|
||||||
$relation = $r->getTable()->getRelation($key);
|
$relation = $r->getTable()->getRelation($key);
|
||||||
|
|
||||||
if ($relation['type'] === Doctrine_Relation::MANY) {
|
if ($relation['type'] === Doctrine_Relation::MANY) {
|
||||||
$r->set($key, $this->hydrate($value, $relation['class'], $key));
|
$relationCollection = $this->hydrate($value, $relation['class']);
|
||||||
|
$relationCollection->setParent($r);
|
||||||
|
|
||||||
|
foreach ($relationCollection as $relationRecord) {
|
||||||
|
$relationTable = $relationRecord->getTable();
|
||||||
|
|
||||||
|
if ($relation = $relationTable->getRelationByClassName($model)) {
|
||||||
|
if ($relation['type'] === Doctrine_Relation::ONE) {
|
||||||
|
$relationRecord->set($relation['alias'], $r);
|
||||||
|
$relationRecord->clearChanges();
|
||||||
|
} else {
|
||||||
|
$coll = new Doctrine_Resource_Collection($relation['class']);
|
||||||
|
$coll[] = $r;
|
||||||
|
|
||||||
|
$relationRecord->set($relation['alias'], $coll);
|
||||||
|
}
|
||||||
|
|
||||||
|
$relationRecord->clearChanges();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$r->set($key, $relationCollection);
|
||||||
} else {
|
} else {
|
||||||
$r->set($key, $this->hydrate(array($value), $relation['class'], $key)->getFirst());
|
$relationRecord = $this->hydrate(array($value), $relation['class'])->getFirst();
|
||||||
|
$relationTable = $relationRecord->getTable();
|
||||||
|
|
||||||
|
if ($relation = $relationTable->getRelationByClassName($model)) {
|
||||||
|
$relationRecord->set($relation['alias'], $r);
|
||||||
|
$relationRecord->clearChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
$r->set($key, $relationRecord);
|
||||||
}
|
}
|
||||||
} else if($r->getTable()->hasColumn($key)) {
|
} else if($r->getTable()->hasColumn($key)) {
|
||||||
$r->set($key, $value);
|
$r->set($key, $value);
|
||||||
|
@ -141,12 +141,25 @@ class Doctrine_Resource_Server extends Doctrine_Resource
|
|||||||
if ($result) {
|
if ($result) {
|
||||||
return Doctrine_Parser::dump($result, $format);
|
return Doctrine_Parser::dump($result, $format);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function run($request)
|
public function run($request)
|
||||||
{
|
{
|
||||||
echo $this->execute($request);
|
try {
|
||||||
|
$result = $this->execute($request);
|
||||||
|
|
||||||
|
echo $result;
|
||||||
|
} catch(Exception $e) {
|
||||||
|
echo $this->exception($e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function exception($e)
|
||||||
|
{
|
||||||
|
$error = array('error' => $e->getMessage());
|
||||||
|
|
||||||
|
return Doctrine_Parser::dump($error);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -48,6 +48,7 @@ class Doctrine_Resource_Table
|
|||||||
|
|
||||||
if (isset($schema['relations'][$model]) && $schema['relations'][$model]) {
|
if (isset($schema['relations'][$model]) && $schema['relations'][$model]) {
|
||||||
$this->_schema['relations'] = $schema['relations'][$model];
|
$this->_schema['relations'] = $schema['relations'][$model];
|
||||||
|
$this->_schema['schema']['relations'] = $this->_schema['relations'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,6 +62,11 @@ class Doctrine_Resource_Table
|
|||||||
return $this->_schema['relations'];
|
return $this->_schema['relations'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getColumns()
|
||||||
|
{
|
||||||
|
return $this->_schema['columns'];
|
||||||
|
}
|
||||||
|
|
||||||
public function getConfig($key = null)
|
public function getConfig($key = null)
|
||||||
{
|
{
|
||||||
return Doctrine_Resource_Client::getInstance()->getConfig($key);
|
return Doctrine_Resource_Client::getInstance()->getConfig($key);
|
||||||
@ -85,7 +91,9 @@ class Doctrine_Resource_Table
|
|||||||
$query = new Doctrine_Resource_Query();
|
$query = new Doctrine_Resource_Query();
|
||||||
$query->from($model)->where($where)->limit(1);
|
$query->from($model)->where($where)->limit(1);
|
||||||
|
|
||||||
return $query->execute()->getFirst();
|
$result = $query->execute();
|
||||||
|
|
||||||
|
return $result->getFirst();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function hasColumn($name)
|
public function hasColumn($name)
|
||||||
@ -111,4 +119,35 @@ class Doctrine_Resource_Table
|
|||||||
return $this->_schema['relations'][$name];
|
return $this->_schema['relations'][$name];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRelationByClassName($name)
|
||||||
|
{
|
||||||
|
$relations = $this->getRelations();
|
||||||
|
|
||||||
|
foreach ($relations as $relation) {
|
||||||
|
if ($relation['class'] === $name) {
|
||||||
|
return $relation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getIdentifier()
|
||||||
|
{
|
||||||
|
$identifier = array();
|
||||||
|
|
||||||
|
$schema = $this->getSchema();
|
||||||
|
$columns = $schema['columns'];
|
||||||
|
|
||||||
|
if (isset($columns) && is_array($columns)) {
|
||||||
|
foreach ($columns as $name => $column) {
|
||||||
|
if ($column['primary'] == true) {
|
||||||
|
$identifier[$name] = $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $identifier;
|
||||||
|
}
|
||||||
}
|
}
|
@ -16,6 +16,11 @@ class User extends Entity
|
|||||||
'foreign' => 'address_id',
|
'foreign' => 'address_id',
|
||||||
'refClass' => 'EntityAddress',
|
'refClass' => 'EntityAddress',
|
||||||
));
|
));
|
||||||
|
$this->hasMany('Address as Addresses', array(
|
||||||
|
'local' => 'user_id',
|
||||||
|
'foreign' => 'address_id',
|
||||||
|
'refClass' => 'EntityAddress',
|
||||||
|
));
|
||||||
$this->hasMany('Album', array('local' => 'id', 'foreign' => 'user_id'));
|
$this->hasMany('Album', array('local' => 'id', 'foreign' => 'user_id'));
|
||||||
$this->hasMany('Book', array('local' => 'id', 'foreign' => 'user_id'));
|
$this->hasMany('Book', array('local' => 'id', 'foreign' => 'user_id'));
|
||||||
$this->hasMany('Group', array(
|
$this->hasMany('Group', array(
|
||||||
|
@ -16,6 +16,8 @@ $users[0]->name = 'zYne';
|
|||||||
$users[0]['Email']->address = 'zYne@example.com';
|
$users[0]['Email']->address = 'zYne@example.com';
|
||||||
$users[0]['Phonenumber'][0]->phonenumber = '123 123';
|
$users[0]['Phonenumber'][0]->phonenumber = '123 123';
|
||||||
|
|
||||||
|
$users[0]['Address'][0]->address = '112 2nd ave';
|
||||||
|
|
||||||
$users[1]->name = 'Arnold Schwarzenegger';
|
$users[1]->name = 'Arnold Schwarzenegger';
|
||||||
$users[1]->Email->address = 'arnold@example.com';
|
$users[1]->Email->address = 'arnold@example.com';
|
||||||
$users[1]['Phonenumber'][0]->phonenumber = '123 123';
|
$users[1]['Phonenumber'][0]->phonenumber = '123 123';
|
||||||
|
@ -21,104 +21,54 @@ if ($action == 'server') {
|
|||||||
// Instantiate a new client
|
// Instantiate a new client
|
||||||
$client = Doctrine_Resource_Client::getInstance($url, $config);
|
$client = Doctrine_Resource_Client::getInstance($url, $config);
|
||||||
|
|
||||||
|
$query = new Doctrine_Resource_Query();
|
||||||
|
$users = $query->from('User u, u.Group g')->execute();
|
||||||
|
|
||||||
|
print_r($users->toArray(true));
|
||||||
|
|
||||||
|
/*
|
||||||
|
$group = new Group();
|
||||||
|
$group->name = 'Jon';
|
||||||
|
$group->save();
|
||||||
|
|
||||||
|
print_r($group->toArray());
|
||||||
|
*/
|
||||||
|
|
||||||
|
//$client->printSchema();
|
||||||
|
|
||||||
|
/*
|
||||||
// Retrieve a models table object
|
// Retrieve a models table object
|
||||||
$table = $client->getTable('User');
|
$table = $client->getTable('User');
|
||||||
|
|
||||||
// Find record by identifier
|
|
||||||
$user = $table->find(4);
|
|
||||||
|
|
||||||
// 2 ways to create queries
|
|
||||||
$query = new Doctrine_Resource_Query();
|
|
||||||
$query->from('User u, u.Phonenumber p')->limit(2);
|
|
||||||
|
|
||||||
// returns users
|
|
||||||
$users = $query->execute();
|
|
||||||
|
|
||||||
print_r($users->toArray());
|
|
||||||
|
|
||||||
/*
|
|
||||||
Array
|
|
||||||
(
|
|
||||||
[User_0] => Array
|
|
||||||
(
|
|
||||||
[id] => 4
|
|
||||||
[name] => zYne
|
|
||||||
[loginname] =>
|
|
||||||
[password] =>
|
|
||||||
[type] => 0
|
|
||||||
[created] =>
|
|
||||||
[updated] =>
|
|
||||||
[email_id] => 1
|
|
||||||
[Phonenumber] => Array
|
|
||||||
(
|
|
||||||
[Phonenumber_0] => Array
|
|
||||||
(
|
|
||||||
[id] => 2
|
|
||||||
[phonenumber] => 123 123
|
|
||||||
[entity_id] => 4
|
|
||||||
)
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
[User_1] => Array
|
|
||||||
(
|
|
||||||
[id] => 5
|
|
||||||
[name] => Arnold Schwarzenegger
|
|
||||||
[loginname] =>
|
|
||||||
[password] =>
|
|
||||||
[type] => 0
|
|
||||||
[created] =>
|
|
||||||
[updated] =>
|
|
||||||
[email_id] => 2
|
|
||||||
[Phonenumber] => Array
|
|
||||||
(
|
|
||||||
[Phonenumber_0] => Array
|
|
||||||
(
|
|
||||||
[id] => 3
|
|
||||||
[phonenumber] => 123 123
|
|
||||||
[entity_id] => 5
|
|
||||||
)
|
|
||||||
|
|
||||||
[Phonenumber_1] => Array
|
|
||||||
(
|
|
||||||
[id] => 4
|
|
||||||
[phonenumber] => 456 456
|
|
||||||
[entity_id] => 5
|
|
||||||
)
|
|
||||||
|
|
||||||
[Phonenumber_2] => Array
|
|
||||||
(
|
|
||||||
[id] => 5
|
|
||||||
[phonenumber] => 789 789
|
|
||||||
[entity_id] => 5
|
|
||||||
)
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
)
|
|
||||||
*/
|
|
||||||
|
|
||||||
$user = new User();
|
$user = new User();
|
||||||
$user->name = 'Jonathan H. Wage';
|
$user->name = 'Jon Wage';
|
||||||
|
|
||||||
|
$user->Email->address = 'jonwage@gmail.com';
|
||||||
|
|
||||||
|
$phone = $user->Phonenumber[0];
|
||||||
|
$phone->phonenumber = '555-5555';
|
||||||
|
|
||||||
|
$phone = $user->Phonenumber[1];
|
||||||
|
$phone->phonenumber = '555-55555';
|
||||||
|
|
||||||
|
$user->Phonenumber[2]->phonenumber = '555';
|
||||||
|
|
||||||
|
$user->Account->amount = 50.00;
|
||||||
|
|
||||||
|
$user->Account->amount = 25.25;
|
||||||
|
|
||||||
|
$address = $user->Address[0];
|
||||||
|
|
||||||
|
$address->address = '112 2nd Ave North';
|
||||||
|
|
||||||
|
$album = $user->Album[0];
|
||||||
|
$album->name = 'test album';
|
||||||
|
|
||||||
|
$song = $album->Song[0];
|
||||||
|
$song->title = 'test author';
|
||||||
|
|
||||||
$user->save();
|
$user->save();
|
||||||
|
|
||||||
print_r($user->toArray());
|
print_r($user->toArray(true));
|
||||||
|
|
||||||
/*
|
|
||||||
Array
|
|
||||||
(
|
|
||||||
[id] => 12
|
|
||||||
[name] => Jonathan H. Wage
|
|
||||||
[loginname] =>
|
|
||||||
[password] =>
|
|
||||||
[type] => 0
|
|
||||||
[created] =>
|
|
||||||
[updated] =>
|
|
||||||
[email_id] =>
|
|
||||||
)
|
|
||||||
*/
|
*/
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user