/** * @param $relation_name * @param Model $object * @param bool $remove_relation * @return bool * @throws Exception * @throws Wave\Exception */ public function _removeRelationObject($relation_name, Model $object, $remove_relation = true) { if (isset($this->_data[$relation_name])) { foreach ($this->_data[$relation_name] as $key => $relation) { if ($relation->_getFingerprint() === $object->_getFingerprint()) { //Unset unset($this->_data[$relation_name][$key]); //Renumber (so it doesn't accidentally map later down the track). $this->_data[$relation_name] = array_values($this->_data[$relation_name]); } } } if ($remove_relation) { $relation_data = $this->_getRelation($relation_name); switch ($relation_data['relation_type']) { case Relation::MANY_TO_MANY: $related_class = $relation_data['related_class']; $db = Wave\DB::get($related_class::_getDatabaseNamespace()); $query = $db->from($related_class, $from_alias); //Add in all of the related columns foreach ($relation_data['local_columns'] as $position => $local_column) { //At this point, may as well return as there aren't null-relations if ($this->_data[$local_column] === null) { return false; } $query->where(sprintf('%s.%s = ?', $from_alias, $db->escape($relation_data['related_columns'][$position])), $this->_data[$local_column]); } //Add in all of the related columns foreach ($relation_data['target_relation']['related_columns'] as $position => $related_column) { //At this point, may as well return as there aren't null-relations if ($object->{$related_column} === null) { return false; } $query->where(sprintf('%s.%s = ?', $from_alias, $db->escape($relation_data['target_relation']['local_columns'][$position])), $object->{$related_column}); } if ($rc = $query->fetchRow()) { return $rc->delete(); } break; case Relation::ONE_TO_MANY: foreach ($relation_data['related_columns'] as $position => $related_column) { $object->{$related_column} = null; } return $object->save(); break; } } }
/** * Execute a delete query for an object * * @param Model $object * * @return bool */ public static function delete(Model &$object) { $database = self::get($object::_getDatabaseNamespace()); $connection = $database->getConnection(); //row identifier $criteria = $params = array(); foreach ($object->_getIdentifyingData() as $identifying_field => $identifying_value) { $value = $database->valueToSQL($identifying_value); $criteria[] = DB\Query::parseWhereCondition(sprintf('%s = ?', $database->escape($identifying_field)), $value); $params = array_merge($params, $value); } $sql = sprintf('DELETE FROM %s.%s WHERE %s;', $database->escape($object::_getSchemaName()), $database->escape($object::_getTableName()), implode(' AND ', $criteria)); $connection->prepare($sql)->execute($params); $object->_setLoaded(false); return true; }