2010-12-06 6 views
0

Considérez le code suivant dans un DataMapper, pour enregistrer les données dans une base de données:Comment mettre à jour les données dans une base de données

/** 
* 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); 
    } 
} 

Ce que je fais est que je sauve mon objet chaque fois. Lorsque vous faites un insert, ce n'est pas un problème. Parce que j'envoie une mise à jour complète remplie. Mais disons que je veux mettre à jour mon mot de passe. Et je fais une mise à jour. Il ne me laisse pas faire la mise à jour, car il est dit que certaines valeurs ne peuvent pas être 0.

Par exemple: déclaration Mysqli exécuter erreur: colonne « nom d'utilisateur » ne peut pas être nulle »

Quel est le meilleur pour soultion cela? dois-je d'abord charger l'objet entier à nouveau à partir de la base de données, puis modifiez les champs et faire la mise à jour? Ou sont utres mieux, des solutions plus communes?

Merci

Répondre

0

oui, vous devez charger tous les champs de la base de données et remplir tous les champs de formulaire requis, sauf les champs de mot de passe et alors changez votre mot de passe et soumettez le formulaire. cela vous aidera à valider le champ requis non NULL et aller plus loin.

Merci.

0

Les réponses de Chandres maheshwari sont une option valide, mais considérez cela comme une alternative.

Je ne connais pas le framework que vous utilisez, mais vous ne pouvez pas créer votre requête vous-même, ou au moins sélectionner les champs que vous souhaitez mettre à jour?

je ferais quelque chose comme:

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); 
    } 
} 

Bien sûr, vous devriez vérifier si un champ est faux/NULL parce qu'il n'a pas été modifié ou parce que l'utilisateur veut réellement vide (ie supprimé) ou assurez-vous que tous les champs ne sont pas NULL lorsque vous insérez.

Questions connexes