1
0
mirror of synced 2025-01-17 22:11:41 +03:00

Added mergeDeep method to Doctrine_Record.

Be carefull when using it as it loads related records.
But can be really convenient, specially when loading data from the
_GET and _POST variables (possibly from a form)
This commit is contained in:
jackbravo 2007-11-26 22:52:36 +00:00
parent 377d157a00
commit a7b86faadf

View File

@ -1492,6 +1492,46 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
}
}
/**
* mergeDeep
* merges this record with an array of values
*
* @pre it is expected that the array keys representing a hasMany
* relationship are the keyColumn set with INDEXBY
*
* @param array $values
* @param $rmFromCollection if some records are not found in the array,
* they are removed from the collection<->relation
* @return void
*/
public function mergeDeep(array $values, $rmFromCollection = false)
{
$this->merge($values);
foreach ($values as $rel_name => $rel_data) {
if ($this->getTable()->hasRelation($rel_name)) {
$rel = $this->get($rel_name);
if ($rel instanceof Doctrine_Collection) {
foreach ($rel as $key => $record) {
if (isset($rel_data[$key])) {
$record->mergeDeep($rel_data[$key], $rmFromCollection);
unset($rel_data[$key]);
} elseif ($rmFromCollection) {
$rel->remove($key);
}
}
foreach ($rel_data as $key => $new_data) {
$new_record = $rel->getTable()->create();
$new_record->mergeDeep($new_data);
$rel->add($new_record, $key);
}
} else {
$rel->mergeDeep($rel_data);
}
}
}
}
/**
* call
*