1
0
mirror of synced 2025-01-19 06:51:40 +03:00

Added link() functionality to create links between related records. It basically works in the opposite way as unlink().

This commit is contained in:
wernerm 2007-12-11 11:10:27 +00:00
parent f1653229ee
commit c655b6023c

View File

@ -45,7 +45,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
/**
* TDIRTY STATE
* a Doctrine_Record is in transient dirty state when it is created
* a Doctrine_Record is in transient dirty state when it is created
* and some of its fields are modified but it is NOT yet persisted into database
*/
const STATE_TDIRTY = 2;
@ -195,9 +195,9 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
$repository = $this->_table->getRepository();
$repository->add($this);
$this->construct();
}
/**
@ -413,7 +413,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
if ($default === null) {
continue;
}
if ($value === self::$_null || $overwrite) {
$this->_data[$column] = $default;
$this->_modified[] = $column;
@ -543,7 +543,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
}
$str = serialize($vars);
$this->postSerialize($event);
return $str;
@ -590,16 +590,16 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
case 'enum':
$this->_data[$k] = $this->_table->enumValue($k, $this->_data[$k]);
break;
}
}
$this->_table->getRepository()->add($this);
$this->cleanData($this->_data);
$this->prepareIdentifiers($this->exists());
$this->postUnserialize($event);
}
@ -627,10 +627,10 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
}
} else if (is_string($state)) {
$upper = strtoupper($state);
$const = 'Doctrine_Record::STATE_' . $upper;
if (defined($const)) {
$this->_state = constant($const);
$this->_state = constant($const);
} else {
$err = true;
}
@ -651,7 +651,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
* 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
* 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)
@ -821,14 +821,14 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
try {
if ( ! isset($this->_references[$fieldName]) && $load) {
$rel = $this->_table->getRelation($fieldName);
$this->_references[$fieldName] = $rel->fetchRelatedFor($this);
}
return $this->_references[$fieldName];
} catch (Doctrine_Table_Exception $e) {
} catch (Doctrine_Table_Exception $e) {
foreach ($this->_table->getFilters() as $filter) {
if (($value = $filter->filterGet($this, $fieldName, $value)) !== null) {
return $value;
@ -913,7 +913,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
}
}
}
/**
* DESCRIBE WHAT THIS METHOD DOES, PLEASE!
* @todo Refactor. What about composite keys?
@ -939,7 +939,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
$relatedTable = $value->getTable();
$foreignFieldName = $relatedTable->getFieldName($rel->getForeign());
$localFieldName = $this->_table->getFieldName($rel->getLocal());
// one-to-one relation found
if ( ! ($value instanceof Doctrine_Record)) {
throw new Doctrine_Record_Exception("Couldn't call Doctrine::set(), second argument should be an instance of Doctrine_Record or Doctrine_Null when setting one-to-one references.");
@ -981,9 +981,9 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
return true;
}
if (isset($this->_values[$fieldName])) {
return true;
return true;
}
if (isset($this->_references[$fieldName]) &&
if (isset($this->_references[$fieldName]) &&
$this->_references[$fieldName] !== self::$_null) {
return true;
@ -1032,7 +1032,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
* In contrast to Doctrine_Record::save(), this method does not
* throw an exception when validation fails but returns TRUE on
* success or FALSE on failure.
*
*
* @param Doctrine_Connection $conn optional connection parameter
* @return TRUE if the record was saved sucessfully without errors, FALSE otherwise.
*/
@ -1086,7 +1086,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
}
return $a;
}
/**
* REDUNDANT?
*/
@ -1110,7 +1110,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
* @return array
* @todo What about a little bit more expressive name? getPreparedData?
*/
public function getPrepared(array $array = array())
public function getPrepared(array $array = array())
{
$a = array();
@ -1293,8 +1293,8 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
/**
* exportTo
*
* @param string $type
* @param string $deep
* @param string $type
* @param string $deep
* @return void
*/
public function exportTo($type, $deep = true)
@ -1309,8 +1309,8 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
/**
* importFrom
*
* @param string $type
* @param string $data
* @param string $type
* @param string $data
* @return void
* @author Jonathan H. Wage
*/
@ -1443,7 +1443,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
$this->_state = Doctrine_Record::STATE_CLEAN;
$this->_modified = array();
} else {
$name = $this->_table->getIdentifier();
$name = $this->_table->getIdentifier();
$this->_id[$name] = $id;
$this->_data[$name] = $id;
$this->_state = Doctrine_Record::STATE_CLEAN;
@ -1465,7 +1465,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
* returns the value of autoincremented primary key of this object (if any)
*
* @return integer
* @todo Better name?
* @todo Better name?
*/
final public function getIncremented()
{
@ -1588,8 +1588,8 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
* getter for node assciated with this record
*
* @return mixed if tree returns Doctrine_Node otherwise returns false
*/
public function getNode()
*/
public function getNode()
{
if ( ! $this->_table->isTree()) {
return false;
@ -1601,7 +1601,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
$this->getTable()->getOption('treeOptions')
);
}
return $this->_node;
}
/**
@ -1644,7 +1644,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
public function unlink($alias, $ids = array())
{
$ids = (array) $ids;
$q = new Doctrine_Query();
$rel = $this->getTable()->getRelation($alias);
@ -1682,6 +1682,80 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
return $this;
}
/**
* link
* 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_Record this object
*/
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->getLocal();
$localFieldDef = $rel->getAssociationTable()->getColumnDefinition($localFieldName);
if ($localFieldDef['type'] == 'integer') {
$identifier = (integer) $identifier;
}
$foreignFieldName = $rel->getForeign();
$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) {
$q->whereIn($rel->getTable()->getIdentifier(), $ids);
}
$q->execute();
} else if ($rel instanceof Doctrine_Relation_LocalKey) {
$q = new Doctrine_Query();
$q->update($this->getTable()->getComponentName())
->set($rel->getLocal(), '?', $ids);
if (count($ids) > 0) {
$q->whereIn($rel->getTable()->getIdentifier(), array_values($this->identifier()));
}
$q->execute();
}
return $this;
}
/**
* __call
* this method is a magic method that is being used for method overloading
@ -1695,29 +1769,29 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
* @param array $args method arguments
* @return mixed the return value of the given method
*/
public function __call($method, $args)
public function __call($method, $args)
{
if (($template = $this->_table->getMethodOwner($method)) !== false) {
$template->setInvoker($this);
return call_user_func_array(array($template, $method), $args);
}
foreach ($this->_table->getTemplates() as $template) {
if (method_exists($template, $method)) {
$template->setInvoker($this);
$this->_table->setMethodOwner($method, $template);
return call_user_func_array(array($template, $method), $args);
}
}
throw new Doctrine_Record_Exception('Unknown method ' . $method);
}
/**
* used to delete node from tree - MUST BE USE TO DELETE RECORD IF TABLE ACTS AS TREE
*
*/
*/
public function deleteNode() {
$this->getNode()->delete();
}