Contactez-nous

Sauvegarde de la nouvelle note en base de données avec Eloquent

Apprenez à persister les données validées d'un formulaire en base de données en utilisant l'ORM Eloquent de Laravel, notamment avec la méthode create().

Introduction à la persistance des données avec Eloquent ORM

Une fois que les données soumises par l'utilisateur via un formulaire ont été récupérées et rigoureusement validées, l'étape suivante consiste à les rendre persistantes, c'est-à-dire à les enregistrer durablement. Dans la plupart des applications web, cela signifie les stocker dans une base de données. Laravel simplifie énormément cette interaction avec la base de données grâce à son ORM (Object-Relational Mapper) intégré, nommé Eloquent.

Eloquent fournit une implémentation simple et élégante du patron de conception Active Record pour travailler avec votre base de données. Chaque table de votre base de données a un "Modèle" correspondant qui est utilisé pour interagir avec cette table. Les modèles vous permettent d'interroger les données de vos tables, ainsi que d'y insérer de nouveaux enregistrements, de les mettre à jour ou de les supprimer, le tout en utilisant une syntaxe PHP orientée objet intuitive, sans avoir à écrire de requêtes SQL complexes (bien que vous puissiez le faire si nécessaire).

Pour notre mini-gestionnaire de notes, nous avons déjà créé le modèle Note (qui correspond à notre table notes) et défini sa structure. Nous allons maintenant voir comment utiliser ce modèle pour enregistrer une nouvelle note après que ses données (titre et contenu) aient passé la validation dans notre méthode store du NoteController.

La méthode `create()` d'Eloquent pour l'assignation de masse

Eloquent offre plusieurs façons d'enregistrer un nouveau modèle en base de données. L'une des méthodes les plus concises et courantes pour créer et sauvegarder un nouveau modèle en une seule étape est la méthode statique create(). Cette méthode accepte un tableau associatif d'attributs et de leurs valeurs. Elle crée une nouvelle instance du modèle, remplit les attributs spécifiés, puis sauvegarde immédiatement l'enregistrement dans la base de données.

Avant d'utiliser la méthode create(), il est crucial de comprendre le concept d'assignation de masse (mass assignment) et les protections associées dans Eloquent. Par défaut, pour des raisons de sécurité, Eloquent protège contre l'assignation de masse non intentionnelle de tous les champs. Cela signifie que vous devez explicitement indiquer quels attributs de votre modèle peuvent être remplis en utilisant des méthodes comme create() ou fill(). Il y a deux façons de le faire dans votre classe de modèle :

  • La propriété $fillable : C'est un tableau contenant les noms des attributs qui sont autorisés à être assignés en masse. C'est l'approche la plus courante et souvent considérée comme la plus sûre car elle est explicite.
  • La propriété $guarded : C'est un tableau contenant les noms des attributs qui ne sont pas autorisés à être assignés en masse. Si vous définissez protected $guarded = [];, cela signifie qu'aucun attribut n'est gardé, et tous peuvent être assignés en masse (à utiliser avec prudence).

Vous ne devriez utiliser qu'une seule de ces propriétés ($fillable ou $guarded) dans un modèle, pas les deux.

Assurons-nous que notre modèle Note est correctement configuré. Ouvrez app/Models/Note.php :


     */
    protected $fillable = [
        'title', // Le champ 'title' peut être assigné en masse
        'content', // Le champ 'content' peut être assigné en masse
    ];

    // Les champs 'id', 'created_at', 'updated_at' sont gérés automatiquement
    // et ne nécessitent généralement pas d'être dans $fillable.
}

Avec cette configuration, nous pouvons maintenant utiliser Note::create() dans notre contrôleur en lui passant directement le tableau $validatedData que nous avons obtenu de la méthode $request->validate(), car ce tableau ne contiendra que les champs title et content que nous avons explicitement autorisés.

Implémentation de la sauvegarde dans le `NoteController`

Retournons à notre méthode store dans app/Http/Controllers/NoteController.php. Après la validation, nous allons appeler Note::create() :

// Dans app/Http/Controllers/NoteController.php

use Illuminate\Http\Request;
use App\Models\Note; // Assurez-vous que le modèle est importé

// ...

public function store(Request $request)
{
    // 1. Validation des données
    $rules = [
        'title' => 'required|string|max:255|min:3',
        'content' => 'required|string|min:10',
    ];
    $customMessages = [
        'title.required' => 'Le titre de la note est obligatoire.',
        'title.min' => 'Le titre doit contenir au moins :min caractères.',
        'content.required' => 'Le contenu de la note ne peut pas être vide.',
        'content.min' => 'Le contenu doit faire au moins :min caractères.'
    ];
    $validatedData = $request->validate($rules, $customMessages);

    // 2. Sauvegarde de la note en base de données
    // $validatedData contient maintenant les champs 'title' et 'content' validés.
    $note = Note::create($validatedData);

    // Si la création réussit, $note contiendra l'instance du modèle nouvellement créé,
    // y compris son 'id' auto-généré et les timestamps 'created_at' et 'updated_at'.

    // dd($note); // Vous pouvez décommenter pour inspecter l'objet $note créé.

    // 3. Redirection avec un message de succès (sera détaillé dans la section suivante)
    // Pour l'instant, un simple message de confirmation :
    // return "Note enregistrée avec succès avec l'ID : " . $note->id;
    return redirect()->route('notes.show', $note->id)
                     ->with('success', 'Félicitations ! Votre note \"' . $note->title . '\" a été créée avec succès.');
}

C'est tout ce qu'il faut pour enregistrer les données ! La ligne $note = Note::create($validatedData); s'occupe de :

  1. Créer une nouvelle instance du modèle Note.
  2. Remplir les attributs title et content avec les valeurs correspondantes de $validatedData.
  3. Définir automatiquement les horodatages created_at et updated_at avec la date et l'heure actuelles.
  4. Exécuter la requête SQL INSERT nécessaire pour ajouter une nouvelle ligne dans la table notes.
  5. Retourner l'instance du modèle $note remplie, y compris son nouvel id auto-incrémenté par la base de données.

Si une erreur se produit au niveau de la base de données pendant cette opération (ce qui est rare si la configuration est correcte et la validation a été faite), Eloquent lèvera une exception.

Alternative : création manuelle d'instance et sauvegarde

Bien que create() soit très pratique, il est parfois utile de créer une instance de modèle, de définir ses attributs individuellement, puis de la sauvegarder explicitement. Cela peut être nécessaire si vous avez des logiques plus complexes pour déterminer les valeurs des attributs ou si vous ne souhaitez pas utiliser l'assignation de masse pour une raison spécifique.

Voici comment cela se présenterait :

// Alternative à Note::create() dans la méthode store()

// $validatedData = $request->validate(...); // Validation effectuée au préalable

$note = new Note(); // Crée une nouvelle instance vide du modèle
$note->title = $validatedData['title']; // Assigne la valeur du titre
$note->content = $validatedData['content']; // Assigne la valeur du contenu
// Vous pourriez ici ajouter d'autres logiques ou assigner d'autres champs si nécessaire

$note->save(); // Sauvegarde l'instance en base de données

// $note contient maintenant l'ID et les timestamps, comme avec create().

// return redirect()->route(...); // Redirection

Cette approche est plus verbeuse mais offre un contrôle plus granulaire sur le processus de création et d'assignation des attributs avant la sauvegarde. La méthode save() est également utilisée pour mettre à jour un modèle existant si celui-ci a déjà été récupéré de la base de données.

Quelle que soit la méthode choisie (create() ou new Model() suivi de save()), Eloquent rend la persistance des données en base de données remarquablement simple et expressive. Une fois la note sauvegardée, l'étape finale de notre flux de travail sera de rediriger l'utilisateur avec un message de confirmation, ce que nous aborderons dans la prochaine section.