Ne met à jour le champ que si la valeur du formulaire existe
Je suis en utilisant le Modèle de Formulaire de Liaison en tant que tel et la mise à jour de ma DB à l'aide de la fill() et save() méthodes.
{{ Form::model($account) }}
{{ Form::text('name', null, array('class'=>'class')) }}
{{ Form::text('email', null, array('class'=>'class')) }}
{{ Form::password('password', array('class'=>'class')) }}
{{ Form::password('password_confirmation', array('class'=>'class')) }}
{{ Form::close() }}
Qui se déclenche mon editAccount méthode de contrôleur:
$rules = array(
'name' => array('required'),
'email' => array('required'),
'password' => array('confirmed')
);
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails())
{
//Redirect
}
//Save to DB
$account->fill(Input::all());
$account->save();
Qui fonctionne très bien, mais si aucun mot de passe n'a été fournie (parce que l'utilisateur ne souhaite pas mettre à jour/modifier) puis le champ mot de passe est défini à null dans la base de données. Donc, je veux seulement le champ de mot de passe pour mettre à jour si une nouvelle valeur de mot de passe est fourni par l'intermédiaire du formulaire.
Je sais que je peux faire ce qui suit:
//Set the fields manually
$account->name = Input::get('name');
$account->email = Input::get('email');
//Only update the password field if a value is supplied
if (Input::get('password')) {
$account->password = Input::get('password');
}
$account->save();
Cependant, je me demande s'il existe une version plus propre façon de gérer cela? Comme un UpdateOnlyIfValueExists() la méthode dans Laravel/Éloquent.
source d'informationauteur Michael Pasqualone
Vous devez vous connecter pour publier un commentaire.
À l'aide de
Input::only('foo', 'bar')
va saisir uniquement les valeurs nécessaires pour compléter la demande - au lieu d'utiliserInput::all()
.Cependant, si 'foo' ou 'bar' n'existe pas dans l'entrée, la clé existe pas avec la valeur de
null
:Pour filtrer de manière propre, et toutes les valeurs avec un
null
valeur:Dans votre exemple, ce serait de remplacer:
$account->fill(Input::all());
Créer le modèle de Base et remplacer fonction de mise à jour comme
Après utilisation:
Vérifier cela, vous pouvez vérifier si le mot de passe est présent en entrée, et de l'exclure de la mesure de masse. Vous pouvez utiliser les commentaires::l'exception et de l'Entrée::uniquement pour ce but
Je m'en tiendrais à votre dernier exemple. Une autre option serait d'utiliser un mutateur qui vérifie la valeur de y, et n'est pas mise à jour si la valeur est vide. Mais à mon avis, Éloquent ne doit pas être responsables.
Je voudrais aussi éviter d'utiliser TOUTES les entrées avec
fill()
. Choisissez uniquement ce que vous voulez.Cela ne fera que mettre à jour le mot de passe si ce n'est pas null
C'est assez merdique et problème commun avec Laravel (et d'autres cadres). Ma solution ressemble à certains...
J'ai toujours le formulaire de Saisie de données::all() stockée dans une variable au début de la mise à jour/store méthodes. Depuis que vous avez généralement besoin d'au moins deux fois (le valider et de le créer/mettre à jour), il semble comme une bonne pratique. Ensuite, et avant de faire autre chose que j'ai vérifier dans la mise à jour() pour que la présence du mot de passe, quelque chose comme ceci:
Et c'est tout, j'espère que ça aide!
Un beaucoup plus propre approche serait d'utiliser Éloquent Des Mutateurs
En aucun cas, voulez-vous permettre à un
null
ou une chaîne vide comme mot de passe vous pouvez définir les éléments suivants mutateur dans votreAccount
modèle.Ci-dessus mutateur ne définir un attribut de mot de passe si il n'est pas
null
et une chaîne vide. Il a également hache le mot de passe avant de l'enregistrer si vous n'avez pas besoin de faire dans votre contrôleur de l'action ou de l'application ailleurs.