/** * Remove a value from a array member * * @param string $property * @param string|int|CHOQ_DB_Object $key * @return self */ public function remove($property, $key) { $member = $this->_getMember($property); if ($member->fieldType != "array") { error("Cannot remove() for '{$member}', is not a array member"); } if ($key instanceof CHOQ_DB_Object) { $id = $key->getId(); if (!$id) { error("Could not use transient object '" . get_class($key) . "' for database usage, in member '{$member}'"); } $key = $id; } $existValue = $this->getByKey($property, $key); if ($existValue !== null) { unset($this->_realValues[$property][$key]); if (!$this->_realValues[$property]) { $this->_realValues[$property] = null; } $this->_changes[$property] = true; } return $this; }
/** * Lazy load array member - Fetch all array values for all objects that stored in the cache * * @param CHOQ_DB_Object $object * @param CHOQ_DB_TypeMember $member */ public function lazyLoadArrayMember(CHOQ_DB_Object $object, CHOQ_DB_TypeMember $member) { $db = $member->getDb ? $member->getDb : $this; $objects = CHOQ_DB_Object::getCachedObjects($db, $object->_getType()); $objects[$object->getId()] = $object; $ids = array(); if ($objects) { foreach ($objects as $o) { if (!isset($o->_loaded[$member->name]) && isset($o->_dbValues[$member->name])) { $ids[$o->getId()] = $o->getId(); } $o->_loaded[$member->name] = true; } } if ($ids) { $table = $db->quote($member->type->class . "_" . $member->name); $tmp = $db->fetchAsAssoc("SELECT * FROM {$table} WHERE " . $db->quote("o") . " IN " . $db->toDb($ids)); if ($member->fieldTypeArrayClass) { $arr = $db->getByIds(NULL, arrayMapProperty($tmp, "v")); foreach ($tmp as $row) { if (isset($arr[$row["v"]])) { $objects[$row["o"]]->add($member->name, $arr[$row["v"]], $arr[$row["v"]]->getId(), false); } } } else { foreach ($tmp as $row) { if (isset($ids[$row["o"]])) { $objects[$row["o"]]->add($member->name, $member->convertFromDbValue($row["v"]), $row["k"], false); } } } } }