2010-12-06 13 views
0

Betrachten Sie den folgenden Code in einem DataMapper, Daten in eine Datenbank zu speichern:So aktualisieren Daten in einer Datenbank

/** 
* Save data into the database 
* @param Site_Model_User $model 
* @throws InvalidArgumentException 
*/ 
public function save($model) { 
    if (!$model instanceof Model_User) { 
     throw new InvalidArgumentException('Model is not of correct type'); 
    } 
    $data = array(); 
    $data['username'] = $model->getUserName(); 
    $data['firstname'] = $model->getFirstName(); 
    $data['lastname'] = $model->getLastName(); 
    $data['email'] = $model->getEmail(); 
    $data['password'] = $model->getPassword(); 
    $data['role'] = $model->getRole(); 
    $data['pic'] = $model->getImage(); 
    if ($model->getId() < 0) { 
     // nieuw object, doe insert 
     $id = $this->getDao()->insert($data); 
     $model->setId($id); 

    } else { 
     // bestaand object, doe update 
     $where = $this->getDao()->getAdapter()->quoteInto('id = ?', $model->getId()); 
     $this->getDao()->update($data, $where); 
    } 
} 

Was ich tue, ist, dass ich mein Objekt jedes Mal zu speichern. Beim Einfügen ist das kein Problem. Weil ich ein komplettes gefülltes Update sende. Aber sagen wir, ich möchte mein Passwort aktualisieren. Und ich mache ein Update. Es lässt mich das Update nicht, weil es sagt, dass bestimmte Werte nicht 0

Zum Beispiel sein kann: Mysqli Anweisung Fehler ausführen: Spalte ‚username‘ nicht null sein kann“

Was für die beste soultion ist das? Soll ich noch einmal das ganze Objekt lädt zuerst aus der Datenbank, dann die Felder ändern und tut dann das Update? Oder sind ther andere bessere, gemeinsame Lösungen?

Dank

Antwort

0

ja, Sie haben zu laden alle Felder aus der Datenbank und füllen Sie alle erforderlichen Formularfelder außer Passwortfelder und dann ändern Sie Ihr Passwort und senden Sie das Formular. Dies wird Ihnen helfen, das erforderliche Feld nicht NULL zu validieren und weiter zu gehen.

Danke.

0

Chandres Maheshwaris Antworten sind eine gültige Option, aber betrachten dies als eine Alternative.

Ich bin nicht vertraut mit dem Framework, das Sie verwenden, aber können Sie Ihre Abfrage nicht selbst erstellen oder zumindest die Felder auswählen, die Sie aktualisieren möchten?

ich tun würde, so etwas wie:

public function save($model) { 
    if (!$model instanceof Model_User) { 
     throw new InvalidArgumentException('Model is not of correct type'); 
    } 
    $data = array(); 
    if($model->getUserName()) 
     $data['username'] = $model->getUserName(); 
    if($model->getFirstName()) 
     $data['firstname'] = $model->getFirstName(); 

    // .... and so on ... 

    if ($model->getId() < 0) { 
     // nieuw object, doe insert 
     $id = $this->getDao()->insert($data); 
     $model->setId($id); 

    } else { 
     // bestaand object, doe update 
     $where = $this->getDao()->getAdapter()->quoteInto('id = ?', $model->getId()); 
     $this->getDao()->update($data, $where); 
    } 
} 

Natürlich sollten Sie überprüfen, ob ein Feld false/NULL ist, weil es nicht verändert wurde oder weil der Benutzer es leer eigentlich will (dh gelöscht) oder stellen Sie sicher, dass alle Felder nicht NULL sind, wenn Sie einfügen.

Verwandte Themen