$event = new \Civi\Core\DAO\Event\PostUpdate($this);
\Civi::service('dispatcher')->dispatch("civi.dao.postUpdate", $event);
}
+ $this->clearDbColumnValueCache();
}
else {
$this->insert();
\Civi::service('dispatcher')->dispatch("civi.dao.postDelete", $event);
$this->free();
+ $this->clearDbColumnValueCache();
+
return $result;
}
CRM_Core_Error::fatal();
}
- $cacheKey = "{$daoName}:{$searchValue}:{$returnColumn}:{$searchColumn}";
- if (self::$_dbColumnValueCache === NULL) {
- self::$_dbColumnValueCache = [];
+ self::$_dbColumnValueCache = self::$_dbColumnValueCache ?? [];
+
+ while (strpos($daoName, '_BAO_') !== FALSE) {
+ $daoName = get_parent_class($daoName);
}
- if (!array_key_exists($cacheKey, self::$_dbColumnValueCache) || $force) {
+ if ($force ||
+ empty(self::$_dbColumnValueCache[$daoName][$searchColumn][$searchValue]) ||
+ !array_key_exists($returnColumn, self::$_dbColumnValueCache[$daoName][$searchColumn][$searchValue])
+ ) {
$object = new $daoName();
$object->$searchColumn = $searchValue;
$object->selectAdd();
if ($object->find(TRUE)) {
$result = $object->$returnColumn;
}
- $object->free();
- self::$_dbColumnValueCache[$cacheKey] = $result;
+ self::$_dbColumnValueCache[$daoName][$searchColumn][$searchValue][$returnColumn] = $result;
}
- return self::$_dbColumnValueCache[$cacheKey];
+ return self::$_dbColumnValueCache[$daoName][$searchColumn][$searchValue][$returnColumn];
}
/**
return $fields;
}
+ /**
+ * Remove item from static cache during update/delete operations
+ */
+ private function clearDbColumnValueCache() {
+ $daoName = get_class($this);
+ while (strpos($daoName, '_BAO_') !== FALSE) {
+ $daoName = get_parent_class($daoName);
+ }
+ if (isset($this->id)) {
+ unset(self::$_dbColumnValueCache[$daoName]['id'][$this->id]);
+ }
+ if (isset($this->name)) {
+ unset(self::$_dbColumnValueCache[$daoName]['name'][$this->name]);
+ }
+ }
+
}