Author: romanb
Date: 2008-09-12 13:15:52 +0100 (Fri, 12 Sep 2008)
New Revision: 4939

Added:
   trunk/lib/Doctrine/ORM/ActiveEntity.php
Removed:
   trunk/lib/Doctrine/ActiveEntity.php
Log:
moved ActiveEntity

Deleted: trunk/lib/Doctrine/ActiveEntity.php
===================================================================
--- trunk/lib/Doctrine/ActiveEntity.php 2008-09-12 12:14:14 UTC (rev 4938)
+++ trunk/lib/Doctrine/ActiveEntity.php 2008-09-12 12:15:52 UTC (rev 4939)
@@ -1,455 +0,0 @@
-<?php
-
-#namespace Doctrine::ORM;
-
-/**
- * The ActiveEntity class adds an ActiveRecord-like interface to Entity classes
- * that allows the Entities to directly interact with the persistence layer.
- * This is mostly just a convenient wrapper for people who want it that 
forwards
- * most method calls to the EntityManager.
- *
- * @since 2.0
- */
-class Doctrine_ActiveEntity extends Doctrine_ORM_Entity
-{
-    /**
-     * Saves the current state of the entity into the database.
-     *
-     * @param Doctrine_Connection $conn                 optional connection 
parameter
-     * @return void
-     * @todo ActiveEntity method.
-     */
-    public function save()
-    {
-        // TODO: Forward to EntityManager. There: registerNew() OR 
registerDirty() on UnitOfWork.
-        $this->_em->save($this);
-    }
-    
-    /**
-     * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
-     * query, except that if there is already a row in the table with the same
-     * key field values, the REPLACE query just updates its values instead of
-     * inserting a new row.
-     *
-     * The REPLACE type of query does not make part of the SQL standards. Since
-     * practically only MySQL and SQLIte implement it natively, this type of
-     * query isemulated through this method for other DBMS using standard types
-     * of queries inside a transaction to assure the atomicity of the 
operation.
-     *
-     * @param Doctrine_Connection $conn             optional connection 
parameter
-     * @throws Doctrine_Connection_Exception        if some of the key values 
was null
-     * @throws Doctrine_Connection_Exception        if there were no key fields
-     * @throws Doctrine_Connection_Exception        if something fails at 
database level
-     * @return integer                              number of rows affected
-     * @todo ActiveEntity method.
-     */
-    public function replace()
-    {
-        return $this->_em->replace(
-                $this->_class,
-                $this->getPrepared(),
-                $this->_id);
-    }
-    
-    /**
-     * Creates an array representation of the object's data.
-     *
-     * @param boolean $deep - Return also the relations
-     * @return array
-     * @todo ActiveEntity method.
-     * @todo Move implementation to EntityManager.
-     */
-    public function toArray($deep = true, $prefixKey = false)
-    {
-        $a = array();
-
-        foreach ($this as $column => $value) {
-            if ($value === Doctrine_Null::$INSTANCE || is_object($value)) {
-                $value = null;
-            }
-            $a[$column] = $value;
-        }
-
-        if ($this->_class->getIdentifierType() == 
Doctrine::IDENTIFIER_AUTOINC) {
-            $idFieldNames = $this->_class->getIdentifier();
-            $idFieldName = $idFieldNames[0];
-            
-            $ids = $this->identifier();
-            $id = count($ids) > 0 ? array_pop($ids) : null;
-            
-            $a[$idFieldName] = $id;
-        }
-
-        if ($deep) {
-            foreach ($this->_references as $key => $relation) {
-                if ( ! $relation instanceof Doctrine_Null) {
-                    $a[$key] = $relation->toArray($deep, $prefixKey);
-                }
-            }
-        }
-
-        // [FIX] Prevent mapped Doctrine_Entitys from being displayed fully
-        foreach ($this->_values as $key => $value) {
-            if ($value instanceof Doctrine_ORM_Entity) {
-                $a[$key] = $value->toArray($deep, $prefixKey);
-            } else {
-                $a[$key] = $value;
-            }
-        }
-
-        return $a;
-    }
-    
-    /**
-     * Merges this Entity with an array of values
-     * or with another existing instance of.
-     *
-     * @param  mixed $data Data to merge. Either another instance of this 
model or an array
-     * @param  bool  $deep Bool value for whether or not to merge the data deep
-     * @return void
-     * @todo ActiveEntity method.
-     * @todo Move implementation to EntityManager.
-     */
-    public function merge($data, $deep = true)
-    {
-        if ($data instanceof $this) {
-            $array = $data->toArray($deep);
-        } else if (is_array($data)) {
-            $array = $data;
-        } else {
-            $array = array();
-        }
-
-        return $this->fromArray($array, $deep);
-    }
-    
-    /**
-     * fromArray
-     *
-     * @param   string $array
-     * @param   bool  $deep Bool value for whether or not to merge the data 
deep
-     * @return  void
-     * @todo ActiveEntity method.
-     * @todo Move implementation to EntityManager.
-     */
-    public function fromArray($array, $deep = true)
-    {
-        if (is_array($array)) {
-            foreach ($array as $key => $value) {
-                if ($deep && $this->getTable()->hasRelation($key)) {
-                    $this->$key->fromArray($value, $deep);
-                } else if ($this->getTable()->hasField($key)) {
-                    $this->set($key, $value);
-                }
-            }
-        }
-    }
-    
-    /**
-     * Synchronizes a Doctrine_Entity and its relations with data from an array
-     *
-     * It expects an array representation of a Doctrine_Entity similar to the 
return
-     * value of the toArray() method. If the array contains relations it will 
create
-     * those that don't exist, update the ones that do, and delete the ones 
missing
-     * on the array but available on the Doctrine_Entity
-     *
-     * @param array $array representation of a Doctrine_Entity
-     * @todo ActiveEntity method.
-     * @todo Move implementation to EntityManager.
-     */
-    public function synchronizeFromArray(array $array)
-    {
-        foreach ($array as $key => $value) {
-            if ($this->getTable()->hasRelation($key)) {
-                $this->get($key)->synchronizeFromArray($value);
-            } else if ($this->getTable()->hasColumn($key)) {
-                $this->set($key, $value);
-            }
-        }
-        // eliminate relationships missing in the $array
-        foreach ($this->_references as $name => $obj) {
-            if ( ! isset($array[$name])) {
-                unset($this->$name);
-            }
-        }
-    }
-    
-   /**
-     * exportTo
-     *
-     * @param string $type
-     * @param string $deep
-     * @return void
-     * @todo ActiveEntity method.
-     */
-    public function exportTo($type, $deep = true)
-    {
-        if ($type == 'array') {
-            return $this->toArray($deep);
-        } else {
-            return Doctrine_Parser::dump($this->toArray($deep, true), $type);
-        }
-    }
-
-    /**
-     * importFrom
-     *
-     * @param string $type
-     * @param string $data
-     * @return void
-     * @author Jonathan H. Wage
-     * @todo ActiveEntity method.
-     */
-    public function importFrom($type, $data)
-    {
-        if ($type == 'array') {
-            return $this->fromArray($data);
-        } else {
-            return $this->fromArray(Doctrine_Parser::load($data, $type));
-        }
-    }
-    
-    /**
-     * Deletes the persistent state of the entity.
-     *
-     * @return boolean  TRUE on success, FALSE on failure.
-     * @todo ActiveRecord method.
-     */
-    public function delete()
-    {
-        // TODO: Forward to EntityManager. There: registerRemoved() on 
UnitOfWork
-        return $this->_em->remove($this);
-    }
-    
-    /**
-     * Creates a copy of the entity.
-     *
-     * @return Doctrine_Entity
-     * @todo ActiveEntity method. Implementation to EntityManager.
-     */
-    public function copy($deep = true)
-    {
-        $data = $this->_data;
-
-        if ($this->_class->getIdentifierType() === 
Doctrine::IDENTIFIER_AUTOINC) {
-            $idFieldNames = (array)$this->_class->getIdentifier();
-            $id = $idFieldNames[0];
-            unset($data[$id]);
-        }
-
-        $ret = $this->_em->createEntity($this->_entityName, $data);
-        $modified = array();
-
-        foreach ($data as $key => $val) {
-            if ( ! ($val instanceof Doctrine_Null)) {
-                $ret->_modified[] = $key;
-            }
-        }
-
-        if ($deep) {
-            foreach ($this->_references as $key => $value) {
-                if ($value instanceof Doctrine_Collection) {
-                    foreach ($value as $record) {
-                        $ret->{$key}[] = $record->copy($deep);
-                    }
-                } else {
-                    $ret->set($key, $value->copy($deep));
-                }
-            }
-        }
-
-        return $ret;
-    }
-    
-    /**
-     * Removes links from this record to given records
-     * if no ids are given, it removes all links
-     *
-     * @param string $alias     related component alias
-     * @param array $ids        the identifiers of the related records
-     * @return Doctrine_Entity  this object
-     * @todo ActiveEntity method.
-     */
-    public function unlink($alias, $ids = array())
-    {
-        $ids = (array) $ids;
-
-        $q = new Doctrine_Query();
-
-        $rel = $this->getTable()->getRelation($alias);
-
-        if ($rel instanceof Doctrine_Relation_Association) {
-            $q->delete()
-              ->from($rel->getAssociationTable()->getComponentName())
-              ->where($rel->getLocal() . ' = ?', 
array_values($this->identifier()));
-
-            if (count($ids) > 0) {
-                $q->whereIn($rel->getForeign(), $ids);
-            }
-
-            $q->execute();
-
-        } else if ($rel instanceof Doctrine_Relation_ForeignKey) {
-            $q->update($rel->getTable()->getComponentName())
-              ->set($rel->getForeign(), '?', array(null))
-              ->addWhere($rel->getForeign() . ' = ?', 
array_values($this->identifier()));
-
-            if (count($ids) > 0) {
-                $relTableIdFieldNames = 
(array)$rel->getTable()->getIdentifier();
-                $q->whereIn($relTableIdFieldNames[0], $ids);
-            }
-
-            $q->execute();
-        }
-        if (isset($this->_references[$alias])) {
-            foreach ($this->_references[$alias] as $k => $record) {
-                
-                if (in_array(current($record->identifier()), $ids)) {
-                    $this->_references[$alias]->remove($k);
-                }
-                
-            }
-            
-            $this->_references[$alias]->takeSnapshot();
-        }
-        return $this;
-    }
-
-
-    /**
-     * Creates links from this record to given records.
-     *
-     * @param string $alias     related component alias
-     * @param array $ids        the identifiers of the related records
-     * @return Doctrine_Entity  this object
-     * @todo ActiveEntity method.
-     */
-    public function link($alias, array $ids)
-    {
-        if ( ! count($ids)) {
-            return $this;
-        }
-
-        $identifier = array_values($this->identifier());
-        $identifier = array_shift($identifier);
-
-        $rel = $this->getTable()->getRelation($alias);
-
-        if ($rel instanceof Doctrine_Relation_Association) {
-            $modelClassName = $rel->getAssociationTable()->getComponentName();
-            $localFieldName = $rel->getLocalFieldName();
-            $localFieldDef  = 
$rel->getAssociationTable()->getColumnDefinition($localFieldName);
-            if ($localFieldDef['type'] == 'integer') {
-                $identifier = (integer) $identifier;
-            }
-            $foreignFieldName = $rel->getForeignFieldName();
-            $foreignFieldDef  = 
$rel->getAssociationTable()->getColumnDefinition($foreignFieldName);
-            if ($foreignFieldDef['type'] == 'integer') {
-                for ($i = 0; $i < count($ids); $i++) {
-                    $ids[$i] = (integer) $ids[$i];
-                }
-            }
-            foreach ($ids as $id) {
-                $record = new $modelClassName;
-                $record[$localFieldName]   = $identifier;
-                $record[$foreignFieldName] = $id;
-                $record->save();
-            }
-
-        } else if ($rel instanceof Doctrine_Relation_ForeignKey) {
-
-            $q = new Doctrine_Query();
-
-            $q->update($rel->getTable()->getComponentName())
-              ->set($rel->getForeign(), '?', 
array_values($this->identifier()));
-
-            if (count($ids) > 0) {
-                $relTableIdFieldNames = 
(array)$rel->getTable()->getIdentifier();
-                $q->whereIn($relTableIdFieldNames[0], $ids);
-            }
-
-            $q->execute();
-
-        } else if ($rel instanceof Doctrine_Relation_LocalKey) {
-            $q = new Doctrine_Query();
-            $q->update($this->getTable()->getComponentName())
-                    ->set($rel->getLocalFieldName(), '?', $ids);
-
-            if (count($ids) > 0) {
-                $relTableIdFieldNames = 
(array)$rel->getTable()->getIdentifier();
-                $q->whereIn($relTableIdFieldNames[0], 
array_values($this->identifier()));
-            }
-
-            $q->execute();
-
-        }
-
-        return $this;
-    }
-    
-   /**
-     * Refresh internal data from the database
-     *
-     * @param bool $deep                        If true, fetch also current 
relations. Caution: this deletes
-     *                                          any aggregated values you may 
have queried beforee
-     *
-     * @throws Doctrine_Record_Exception        When the refresh operation 
fails (when the database row
-     *                                          this record represents does 
not exist anymore)
-     * @return boolean
-     * @todo Implementation to EntityManager.
-     * @todo Move to ActiveEntity (extends Entity). Implementation to 
EntityManager.
-     */
-    public function refresh($deep = false)
-    {
-        $id = $this->identifier();
-        if ( ! is_array($id)) {
-            $id = array($id);
-        }
-        if (empty($id)) {
-            return false;
-        }
-        $id = array_values($id);
-
-        if ($deep) {
-            $query = $this->_em->createQuery()->from($this->_entityName);
-            foreach (array_keys($this->_references) as $name) {
-                $query->leftJoin(get_class($this) . '.' . $name);
-            }
-            $query->where(implode(' = ? AND ', 
$this->_class->getIdentifierColumnNames()) . ' = ?');
-            $this->clearRelated();
-            $record = $query->fetchOne($id);
-        } else {
-            // Use FETCH_ARRAY to avoid clearing object relations
-            $record = $this->getRepository()->find($this->identifier(), 
Doctrine::HYDRATE_ARRAY);
-            if ($record) {
-                $this->hydrate($record);
-            }
-        }
-
-        if ($record === false) {
-            throw new Doctrine_Record_Exception('Failed to refresh. Record 
does not exist.');
-        }
-
-        $this->_modified = array();
-
-        $this->_extractIdentifier();
-
-        $this->_state = Doctrine_ORM_Entity::STATE_CLEAN;
-
-        return $this;
-    }
-    
-    /**
-     * Hydrates this object from given array
-     *
-     * @param array $data
-     * @return boolean
-     */
-    final public function hydrate(array $data)
-    {
-        $this->_data = array_merge($this->_data, $data);
-        $this->_extractIdentifier();
-    }
-}
-
-?>
\ No newline at end of file

Added: trunk/lib/Doctrine/ORM/ActiveEntity.php
===================================================================
--- trunk/lib/Doctrine/ORM/ActiveEntity.php                             (rev 0)
+++ trunk/lib/Doctrine/ORM/ActiveEntity.php     2008-09-12 12:15:52 UTC (rev 
4939)
@@ -0,0 +1,455 @@
+<?php
+
+#namespace Doctrine::ORM;
+
+/**
+ * The ActiveEntity class adds an ActiveRecord-like interface to Entity classes
+ * that allows the Entities to directly interact with the persistence layer.
+ * This is mostly just a convenient wrapper for people who want it that 
forwards
+ * most method calls to the EntityManager.
+ *
+ * @since 2.0
+ */
+class Doctrine_ORM_ActiveEntity extends Doctrine_ORM_Entity
+{
+    /**
+     * Saves the current state of the entity into the database.
+     *
+     * @param Doctrine_Connection $conn                 optional connection 
parameter
+     * @return void
+     * @todo ActiveEntity method.
+     */
+    public function save()
+    {
+        // TODO: Forward to EntityManager. There: registerNew() OR 
registerDirty() on UnitOfWork.
+        $this->_em->save($this);
+    }
+    
+    /**
+     * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
+     * query, except that if there is already a row in the table with the same
+     * key field values, the REPLACE query just updates its values instead of
+     * inserting a new row.
+     *
+     * The REPLACE type of query does not make part of the SQL standards. Since
+     * practically only MySQL and SQLIte implement it natively, this type of
+     * query isemulated through this method for other DBMS using standard types
+     * of queries inside a transaction to assure the atomicity of the 
operation.
+     *
+     * @param Doctrine_Connection $conn             optional connection 
parameter
+     * @throws Doctrine_Connection_Exception        if some of the key values 
was null
+     * @throws Doctrine_Connection_Exception        if there were no key fields
+     * @throws Doctrine_Connection_Exception        if something fails at 
database level
+     * @return integer                              number of rows affected
+     * @todo ActiveEntity method.
+     */
+    public function replace()
+    {
+        return $this->_em->replace(
+                $this->_class,
+                $this->getPrepared(),
+                $this->_id);
+    }
+    
+    /**
+     * Creates an array representation of the object's data.
+     *
+     * @param boolean $deep - Return also the relations
+     * @return array
+     * @todo ActiveEntity method.
+     * @todo Move implementation to EntityManager.
+     */
+    public function toArray($deep = true, $prefixKey = false)
+    {
+        $a = array();
+
+        foreach ($this as $column => $value) {
+            if ($value === Doctrine_Null::$INSTANCE || is_object($value)) {
+                $value = null;
+            }
+            $a[$column] = $value;
+        }
+
+        if ($this->_class->getIdentifierType() == 
Doctrine::IDENTIFIER_AUTOINC) {
+            $idFieldNames = $this->_class->getIdentifier();
+            $idFieldName = $idFieldNames[0];
+            
+            $ids = $this->identifier();
+            $id = count($ids) > 0 ? array_pop($ids) : null;
+            
+            $a[$idFieldName] = $id;
+        }
+
+        if ($deep) {
+            foreach ($this->_references as $key => $relation) {
+                if ( ! $relation instanceof Doctrine_Null) {
+                    $a[$key] = $relation->toArray($deep, $prefixKey);
+                }
+            }
+        }
+
+        // [FIX] Prevent mapped Doctrine_Entitys from being displayed fully
+        foreach ($this->_values as $key => $value) {
+            if ($value instanceof Doctrine_ORM_Entity) {
+                $a[$key] = $value->toArray($deep, $prefixKey);
+            } else {
+                $a[$key] = $value;
+            }
+        }
+
+        return $a;
+    }
+    
+    /**
+     * Merges this Entity with an array of values
+     * or with another existing instance of.
+     *
+     * @param  mixed $data Data to merge. Either another instance of this 
model or an array
+     * @param  bool  $deep Bool value for whether or not to merge the data deep
+     * @return void
+     * @todo ActiveEntity method.
+     * @todo Move implementation to EntityManager.
+     */
+    public function merge($data, $deep = true)
+    {
+        if ($data instanceof $this) {
+            $array = $data->toArray($deep);
+        } else if (is_array($data)) {
+            $array = $data;
+        } else {
+            $array = array();
+        }
+
+        return $this->fromArray($array, $deep);
+    }
+    
+    /**
+     * fromArray
+     *
+     * @param   string $array
+     * @param   bool  $deep Bool value for whether or not to merge the data 
deep
+     * @return  void
+     * @todo ActiveEntity method.
+     * @todo Move implementation to EntityManager.
+     */
+    public function fromArray($array, $deep = true)
+    {
+        if (is_array($array)) {
+            foreach ($array as $key => $value) {
+                if ($deep && $this->getTable()->hasRelation($key)) {
+                    $this->$key->fromArray($value, $deep);
+                } else if ($this->getTable()->hasField($key)) {
+                    $this->set($key, $value);
+                }
+            }
+        }
+    }
+    
+    /**
+     * Synchronizes a Doctrine_Entity and its relations with data from an array
+     *
+     * It expects an array representation of a Doctrine_Entity similar to the 
return
+     * value of the toArray() method. If the array contains relations it will 
create
+     * those that don't exist, update the ones that do, and delete the ones 
missing
+     * on the array but available on the Doctrine_Entity
+     *
+     * @param array $array representation of a Doctrine_Entity
+     * @todo ActiveEntity method.
+     * @todo Move implementation to EntityManager.
+     */
+    public function synchronizeFromArray(array $array)
+    {
+        foreach ($array as $key => $value) {
+            if ($this->getTable()->hasRelation($key)) {
+                $this->get($key)->synchronizeFromArray($value);
+            } else if ($this->getTable()->hasColumn($key)) {
+                $this->set($key, $value);
+            }
+        }
+        // eliminate relationships missing in the $array
+        foreach ($this->_references as $name => $obj) {
+            if ( ! isset($array[$name])) {
+                unset($this->$name);
+            }
+        }
+    }
+    
+   /**
+     * exportTo
+     *
+     * @param string $type
+     * @param string $deep
+     * @return void
+     * @todo ActiveEntity method.
+     */
+    public function exportTo($type, $deep = true)
+    {
+        if ($type == 'array') {
+            return $this->toArray($deep);
+        } else {
+            return Doctrine_Parser::dump($this->toArray($deep, true), $type);
+        }
+    }
+
+    /**
+     * importFrom
+     *
+     * @param string $type
+     * @param string $data
+     * @return void
+     * @author Jonathan H. Wage
+     * @todo ActiveEntity method.
+     */
+    public function importFrom($type, $data)
+    {
+        if ($type == 'array') {
+            return $this->fromArray($data);
+        } else {
+            return $this->fromArray(Doctrine_Parser::load($data, $type));
+        }
+    }
+    
+    /**
+     * Deletes the persistent state of the entity.
+     *
+     * @return boolean  TRUE on success, FALSE on failure.
+     * @todo ActiveRecord method.
+     */
+    public function delete()
+    {
+        // TODO: Forward to EntityManager. There: registerRemoved() on 
UnitOfWork
+        return $this->_em->remove($this);
+    }
+    
+    /**
+     * Creates a copy of the entity.
+     *
+     * @return Doctrine_Entity
+     * @todo ActiveEntity method. Implementation to EntityManager.
+     */
+    public function copy($deep = true)
+    {
+        $data = $this->_data;
+
+        if ($this->_class->getIdentifierType() === 
Doctrine::IDENTIFIER_AUTOINC) {
+            $idFieldNames = (array)$this->_class->getIdentifier();
+            $id = $idFieldNames[0];
+            unset($data[$id]);
+        }
+
+        $ret = $this->_em->createEntity($this->_entityName, $data);
+        $modified = array();
+
+        foreach ($data as $key => $val) {
+            if ( ! ($val instanceof Doctrine_Null)) {
+                $ret->_modified[] = $key;
+            }
+        }
+
+        if ($deep) {
+            foreach ($this->_references as $key => $value) {
+                if ($value instanceof Doctrine_Collection) {
+                    foreach ($value as $record) {
+                        $ret->{$key}[] = $record->copy($deep);
+                    }
+                } else {
+                    $ret->set($key, $value->copy($deep));
+                }
+            }
+        }
+
+        return $ret;
+    }
+    
+    /**
+     * Removes links from this record to given records
+     * if no ids are given, it removes all links
+     *
+     * @param string $alias     related component alias
+     * @param array $ids        the identifiers of the related records
+     * @return Doctrine_Entity  this object
+     * @todo ActiveEntity method.
+     */
+    public function unlink($alias, $ids = array())
+    {
+        $ids = (array) $ids;
+
+        $q = new Doctrine_Query();
+
+        $rel = $this->getTable()->getRelation($alias);
+
+        if ($rel instanceof Doctrine_Relation_Association) {
+            $q->delete()
+              ->from($rel->getAssociationTable()->getComponentName())
+              ->where($rel->getLocal() . ' = ?', 
array_values($this->identifier()));
+
+            if (count($ids) > 0) {
+                $q->whereIn($rel->getForeign(), $ids);
+            }
+
+            $q->execute();
+
+        } else if ($rel instanceof Doctrine_Relation_ForeignKey) {
+            $q->update($rel->getTable()->getComponentName())
+              ->set($rel->getForeign(), '?', array(null))
+              ->addWhere($rel->getForeign() . ' = ?', 
array_values($this->identifier()));
+
+            if (count($ids) > 0) {
+                $relTableIdFieldNames = 
(array)$rel->getTable()->getIdentifier();
+                $q->whereIn($relTableIdFieldNames[0], $ids);
+            }
+
+            $q->execute();
+        }
+        if (isset($this->_references[$alias])) {
+            foreach ($this->_references[$alias] as $k => $record) {
+                
+                if (in_array(current($record->identifier()), $ids)) {
+                    $this->_references[$alias]->remove($k);
+                }
+                
+            }
+            
+            $this->_references[$alias]->takeSnapshot();
+        }
+        return $this;
+    }
+
+
+    /**
+     * Creates links from this record to given records.
+     *
+     * @param string $alias     related component alias
+     * @param array $ids        the identifiers of the related records
+     * @return Doctrine_Entity  this object
+     * @todo ActiveEntity method.
+     */
+    public function link($alias, array $ids)
+    {
+        if ( ! count($ids)) {
+            return $this;
+        }
+
+        $identifier = array_values($this->identifier());
+        $identifier = array_shift($identifier);
+
+        $rel = $this->getTable()->getRelation($alias);
+
+        if ($rel instanceof Doctrine_Relation_Association) {
+            $modelClassName = $rel->getAssociationTable()->getComponentName();
+            $localFieldName = $rel->getLocalFieldName();
+            $localFieldDef  = 
$rel->getAssociationTable()->getColumnDefinition($localFieldName);
+            if ($localFieldDef['type'] == 'integer') {
+                $identifier = (integer) $identifier;
+            }
+            $foreignFieldName = $rel->getForeignFieldName();
+            $foreignFieldDef  = 
$rel->getAssociationTable()->getColumnDefinition($foreignFieldName);
+            if ($foreignFieldDef['type'] == 'integer') {
+                for ($i = 0; $i < count($ids); $i++) {
+                    $ids[$i] = (integer) $ids[$i];
+                }
+            }
+            foreach ($ids as $id) {
+                $record = new $modelClassName;
+                $record[$localFieldName]   = $identifier;
+                $record[$foreignFieldName] = $id;
+                $record->save();
+            }
+
+        } else if ($rel instanceof Doctrine_Relation_ForeignKey) {
+
+            $q = new Doctrine_Query();
+
+            $q->update($rel->getTable()->getComponentName())
+              ->set($rel->getForeign(), '?', 
array_values($this->identifier()));
+
+            if (count($ids) > 0) {
+                $relTableIdFieldNames = 
(array)$rel->getTable()->getIdentifier();
+                $q->whereIn($relTableIdFieldNames[0], $ids);
+            }
+
+            $q->execute();
+
+        } else if ($rel instanceof Doctrine_Relation_LocalKey) {
+            $q = new Doctrine_Query();
+            $q->update($this->getTable()->getComponentName())
+                    ->set($rel->getLocalFieldName(), '?', $ids);
+
+            if (count($ids) > 0) {
+                $relTableIdFieldNames = 
(array)$rel->getTable()->getIdentifier();
+                $q->whereIn($relTableIdFieldNames[0], 
array_values($this->identifier()));
+            }
+
+            $q->execute();
+
+        }
+
+        return $this;
+    }
+    
+   /**
+     * Refresh internal data from the database
+     *
+     * @param bool $deep                        If true, fetch also current 
relations. Caution: this deletes
+     *                                          any aggregated values you may 
have queried beforee
+     *
+     * @throws Doctrine_Record_Exception        When the refresh operation 
fails (when the database row
+     *                                          this record represents does 
not exist anymore)
+     * @return boolean
+     * @todo Implementation to EntityManager.
+     * @todo Move to ActiveEntity (extends Entity). Implementation to 
EntityManager.
+     */
+    public function refresh($deep = false)
+    {
+        $id = $this->identifier();
+        if ( ! is_array($id)) {
+            $id = array($id);
+        }
+        if (empty($id)) {
+            return false;
+        }
+        $id = array_values($id);
+
+        if ($deep) {
+            $query = $this->_em->createQuery()->from($this->_entityName);
+            foreach (array_keys($this->_references) as $name) {
+                $query->leftJoin(get_class($this) . '.' . $name);
+            }
+            $query->where(implode(' = ? AND ', 
$this->_class->getIdentifierColumnNames()) . ' = ?');
+            $this->clearRelated();
+            $record = $query->fetchOne($id);
+        } else {
+            // Use FETCH_ARRAY to avoid clearing object relations
+            $record = $this->getRepository()->find($this->identifier(), 
Doctrine::HYDRATE_ARRAY);
+            if ($record) {
+                $this->hydrate($record);
+            }
+        }
+
+        if ($record === false) {
+            throw new Doctrine_Record_Exception('Failed to refresh. Record 
does not exist.');
+        }
+
+        $this->_modified = array();
+
+        $this->_extractIdentifier();
+
+        $this->_state = Doctrine_ORM_Entity::STATE_CLEAN;
+
+        return $this;
+    }
+    
+    /**
+     * Hydrates this object from given array
+     *
+     * @param array $data
+     * @return boolean
+     */
+    final public function hydrate(array $data)
+    {
+        $this->_data = array_merge($this->_data, $data);
+        $this->_extractIdentifier();
+    }
+}
+
+?>
\ No newline at end of file


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"doctrine-svn" group.
 To post to this group, send email to [email protected]
 To unsubscribe from this group, send email to [EMAIL PROTECTED]
 For more options, visit this group at 
http://groups.google.co.uk/group/doctrine-svn?hl=en-GB
-~----------~----~----~----~------~----~------~--~---

Reply via email to