# ORM Minimaliste PHP

**Nom du script :** Model.php  
**Description :**  
Ce script est la classe de base pour un ORM minimaliste en PHP. Il permet de gérer facilement les opérations CRUD, la suppression logique, les transactions, la pagination, la recherche avancée et les relations entre modèles.  
Il intègre également des hooks pour personnaliser le comportement avant et après certaines opérations (ex. avant la sauvegarde ou après la suppression).

**Options éventuelles :**  
- **Hooks personnalisables :** `beforeSave()` et `afterDelete()` à surcharger dans vos modèles.  
- **Suppression logique :** Utilise la colonne `deleted_at` si présente pour réaliser un soft delete (sinon effectue une suppression définitive).  
- **Requêtes avancées :** Méthodes `search()`, `whereActive()`, `whereDeleted()`, `whereNotDeleted()`.  
- **Gestion des relations :** `hasOne()`, `hasMany()`, `belongsTo()` (avec optimisation via JOIN).  
- **Transactions :** Méthodes `beginTransaction()`, `commit()`, `rollback()`.  
- **Pagination :** Méthode `paginate()` permettant de récupérer des résultats page par page.  
- **Vérification d'existence :** Méthode `exists()` pour vérifier rapidement la présence d'un enregistrement.

**Exemples d'utilisation :**

1. **Création d'un nouvel enregistrement :**

   ```php
   use App\Models\Utilisateur;
   
   $utilisateur = new Utilisateur([
       'prenom'       => 'Sylvain',
       'nom'          => 'SCATTOLINI',
       'email'        => 'sylvain@example.com',
       'mot_de_passe' => password_hash('secret', PASSWORD_BCRYPT),
       'role'         => 'client'
   ]);
   
   if ($utilisateur->save()) {
       echo "Utilisateur créé avec succès, ID : " . $utilisateur->id;
   } else {
       echo "Erreur lors de la création de l'utilisateur.";
   }

    Mise à jour d'un enregistrement existant :

$utilisateur = Utilisateur::find(1);
if ($utilisateur) {
    $utilisateur->prenom = 'Alice-Marie';
    $utilisateur->save(); // Appelle UPDATE car l'ID existe déjà
    echo "Mise à jour réussie.";
}

Suppression d'un enregistrement :

// Suppression logique (soft delete)
$utilisateur = Utilisateur::find(1);
if ($utilisateur->delete()) {
    echo "Utilisateur supprimé logiquement.";
}

// Suppression définitive (force delete)
if ($utilisateur->delete(true)) {
    echo "Utilisateur supprimé définitivement.";
}

Restauration d'un enregistrement supprimé :

$utilisateur = Utilisateur::find(1);
if ($utilisateur && $utilisateur->restore()) {
    echo "Utilisateur restauré.";
}

Recherches et pagination :

// Rechercher un utilisateur par email
$utilisateur = Utilisateur::first('email', 'sylvain@example.com');

// Récupérer tous les utilisateurs
$tousLesUtilisateurs = Utilisateur::all();

// Recherche avancée sur plusieurs colonnes
$resultats = Utilisateur::search(['prenom', 'nom', 'email'], 'sylvain');

// Pagination (page 1 avec 10 résultats par page)
$page1 = Utilisateur::paginate(1, 10);

Gestion des relations :

Dans le modèle Utilisateur, vous pouvez définir des relations vers d'autres modèles, par exemple :

// Relation 1:1
public function profil(): ?Profil {
    return $this->hasOne(Profil::class, 'utilisateur_id');
}

// Relation 1:N
public function commandes(): array {
    return $this->hasMany(Commande::class, 'utilisateur_id');
}

// Relation inverse
public function entreprise(): ?Entreprise {
    return $this->belongsTo(Entreprise::class, 'entreprise_id');
}

Utilisation des transactions :

Utilisateur::beginTransaction();
try {
    $utilisateur = Utilisateur::find(1);
    $utilisateur->prenom = 'Test';
    $utilisateur->save();
    Utilisateur::commit();
} catch (Exception $e) {
    Utilisateur::rollback();
    echo "Erreur : " . $e->getMessage();
}

Vérification d'existence :

    if (Utilisateur::exists('email', 'sylvain@example.com')) {
        echo "L'utilisateur existe déjà.";
    } else {
        echo "L'utilisateur n'existe pas.";
    }

Prérequis :

    PHP 8.0 ou supérieur
    PDO avec support MySQL
    Un fichier de configuration pour la connexion à la base de données via la classe Database

Auteur : Sylvain SCATTOLINI
Date de création / modification : 09/02/2025
Version : 1.2