Added a $deep argument to refresh
The default is set to false because fetching the relations deletes previously fetched relations =P. This is, if you fetched an aggregated value (SUM, COUNT), it wont be refreshed, it will be overwritten by the actual related values.
This commit is contained in:
parent
724cc2b1e7
commit
b329ae870b
@ -649,11 +649,14 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
|
|||||||
* refresh
|
* refresh
|
||||||
* refresh internal data from the database
|
* 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
|
* @throws Doctrine_Record_Exception When the refresh operation fails (when the database row
|
||||||
* this record represents does not exist anymore)
|
* this record represents does not exist anymore)
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
public function refresh()
|
public function refresh($deep = false)
|
||||||
{
|
{
|
||||||
$id = $this->identifier();
|
$id = $this->identifier();
|
||||||
if ( ! is_array($id)) {
|
if ( ! is_array($id)) {
|
||||||
@ -664,15 +667,25 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count
|
|||||||
}
|
}
|
||||||
$id = array_values($id);
|
$id = array_values($id);
|
||||||
|
|
||||||
|
if ($deep) {
|
||||||
|
$query = $this->getTable()->createQuery();
|
||||||
|
foreach (array_keys($this->_references) as $name) {
|
||||||
|
$query->leftJoin(get_class($this) . '.' . $name);
|
||||||
|
}
|
||||||
|
$query->where(implode(' = ? AND ', $this->getTable()->getIdentifierColumnNames()) . ' = ?');
|
||||||
|
$record = $query->fetchOne($id);
|
||||||
|
} else {
|
||||||
// Use FETCH_ARRAY to avoid clearing object relations
|
// Use FETCH_ARRAY to avoid clearing object relations
|
||||||
$record = $this->getTable()->find($id, Doctrine::FETCH_ARRAY);
|
$record = $this->getTable()->find($id, Doctrine::HYDRATE_ARRAY);
|
||||||
|
if ($record) {
|
||||||
|
$this->hydrate($record);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($record === false) {
|
if ($record === false) {
|
||||||
throw new Doctrine_Record_Exception('Failed to refresh. Record does not exist.');
|
throw new Doctrine_Record_Exception('Failed to refresh. Record does not exist.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->hydrate($record);
|
|
||||||
|
|
||||||
$this->_modified = array();
|
$this->_modified = array();
|
||||||
|
|
||||||
$this->prepareIdentifiers();
|
$this->prepareIdentifiers();
|
||||||
|
@ -868,4 +868,29 @@ class Doctrine_Record_TestCase extends Doctrine_UnitTestCase
|
|||||||
$this->assertEqual(count($user->Address), 0);
|
$this->assertEqual(count($user->Address), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testRefreshDeep()
|
||||||
|
{
|
||||||
|
$user = $this->connection->getTable("User")->find(4);
|
||||||
|
$user->Address[0]->address = "Address #1";
|
||||||
|
$user->Address[1]->address = "Address #2";
|
||||||
|
$user->save();
|
||||||
|
$this->assertEqual(count($user->Address), 2);
|
||||||
|
|
||||||
|
Doctrine_Query::create()->delete()->from('EntityAddress')->where('user_id = ? AND address_id = ?', array($user->id, $user->Address[1]->id))->execute();
|
||||||
|
$user->refresh(true);
|
||||||
|
$this->assertEqual(count($user->Address), 1);
|
||||||
|
|
||||||
|
$address = $user->Address[0];
|
||||||
|
Doctrine_Query::create()->delete()->from('EntityAddress')->where('user_id = ? AND address_id = ?', array($user->id, $user->Address[0]->id))->execute();
|
||||||
|
$user->refresh(true);
|
||||||
|
$this->assertEqual(count($user->Address), 0);
|
||||||
|
|
||||||
|
$entity_address = new EntityAddress();
|
||||||
|
$entity_address->user_id = $user->id;
|
||||||
|
$entity_address->address_id = $address->id;
|
||||||
|
$entity_address->save();
|
||||||
|
$this->assertNotEqual(count($user->Address), 1);
|
||||||
|
$user->refresh(true);
|
||||||
|
$this->assertEqual(count($user->Address), 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user