Feed Rss



Apr 28 2010

UPDATE statt INSERT

category: Datenbanken author: ferdinand

Im Sinne von Fat Models – Skinny Controllers wollte ich folgendes Problem im Model lösen:
bevor ein Eintrag gespeichert wird, wird die Datenbank nach einem Eintrag mit gleichem Inhalt durchsucht und gegebenenfalls dieser verändert.

Ich ging davon aus, dass diese Aufgabe am besten im beforeSave() Callback aufgehoben sei. Cake entscheidet anhand des Felds Model->id ob ein Eintrag erstellt oder verändert werden soll. Also muss man nur die Id des bereits vorhandenen Eintrags suchen und das Feld entsprechend setzen.
Das funktioniert allerdings nicht – Cake erstellt trotzdem stur neue Einträge. Eine Google Suche brachte die Lösung. Cake prüft die Existenz von Einträgen während des Validierens. Der richtige Callback für solche Aufgaben ist also beforeValidate().

Mit folgendem Code funktioniert das jetzt einwandfrei:

function beforeValidate() {
	if (isset($this->data['Difference']) && !empty($this->data['Difference'])) {
		// conditions anpassen
		$conditions = $this->data['Difference'];
		unset($conditions['value_a'], $conditions['value_b']);
		// nach bereits existierendem Eintrag suchen
		$entry = $this->find('first', array(
			'conditions' => $conditions,
			'fields' => array('id', 'flag')
		));
		// falls Eintrag schon existiert UPDATE,
		// sonst INSERT
		if (!empty($entry)) {
			$this->id = $entry['Difference']['id'];
			$this->data['Difference']['flag'] = $entry['Difference']['flag'];
		} else {
			$this->data['Difference']['flag'] = 'new';
		}
		return true;
	}
	return false;
}

Leave a Reply