Example #1
0
 /**
  * @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;
         }
     }
 }