Documentation : Modèle

Présentation

La couche modèle est celle qui gère la lecture et l'enregistrement d'informations dans la base de données.

Temma propose 3 mécanismes pour cela :

  • Accès direct à la base de données, en utilisant l'objet d'abstraction FineDatabase.
  • Création automatique d'un objet DAO par le framework, pour accéder facilement à une table sans écrire de code.
  • Écriture de vos propres objets DAO, pour faire des requêtes plus efficaces que ne le feraient un outil automatique.

La manière d'utiliser ces mécanismes est à votre choix. Toutefois, nous vous suggérons de procéder de la sorte :

  1. Commencez par utiliser la DAO générée automatiquement par Temma. Elle vous permet d'écrire votre code applicatif rapidement. Tant que vous n'avez besoin que de requêtes simples portant sur une seule table, cela fonctionne très bien.
  2. Si vous souhaitez simplifier l'utilisation de la DAO, vous pouvez créer votre propre DAO, qui étende celle par défaut. Par exemple, vous pourrez créer une méthode :
    $data = $userDao->getProfessionalUsers()
    qui sera plus simple d'emploi que :
    $data = $dao->search(/* critères de recherche */);
    Ces méthodes supplémentaires ne seront que des surcouches servant à simplifier l'utilisation de la DAO, mais l'implémentation restera toujours aussi simple et rapide à écrire.
  3. Par la suite, vous pourrez enrichir votre DAO personnalisée, pour lui faire réaliser des requêtes complexes (avec des jointures sur plusieurs tables, des sous-requêtes, des regroupements, etc.). Vous devrez alors accéder directement à la base de données et écrire vos propres requêtes SQL, mais vous bénéficierez du mécanisme de simplification d'écriture des requêtes proposé par le framework.

Documentation : FineDatabase

Si vous avez correctement configuré les paramètres de connexion à la base de données, Temma crée automatiquement un objet FineDatabase, qui permet d'exécuter des requêtes directement sur la base de données et d'en récupérer le résultat.

exec(string)

La méthode exec() sert à exécuter des requêtes pour lesquelles on n'attend pas de données en retour.

$this->_db->exec("DELETE FROM article WHERE id = '12'");
$this->_db->exec("UPDATE user SET lastLogin = NOW() WHERE lastLogin IS NULL");
						
queryOne(string)

La méthode queryOne() sert à exécuter des requêtes pour lesquelles on veut récupérer une ligne de données. Les informations sont retournées sous la forme d'un tableau associatif, dont les clés correspondent aux noms des champs.

$data = $this->_db->queryOne("SELECT * FROM article WHERE id = '11'");
print_r($data);
						

Ce qui donnera un résultat du genre :

Array
(
    [id] => 11
    [status] => valid
    [title] => Titre de l'article
    [creationDate] => 2011-04-04 23:17:39
    [content] => Texte de l'article ...
    [authorId] => 2
)
						
queryAll(string)

La méthode queryAll() sert à exécuter des requêtes qui retournent plusieurs lignes de données. On récupère les informations sous la forme d'une liste dont chaque élément est un tableau associatif représentant une ligne de données, dont les clés correspondent aux noms des champs.

$data = $this->_db->queryAll("SELECT * FROM article WHERE authorId = '2'");
print_r($data);
						

Ce qui donnera un résultat du genre :

Array
(
    [0] => Array
        (
            [id] => 11
            [status] => valid
            [title] => Titre de l'article
            [creationDate] => 2011-04-04 23:17:39
            [content] => Texte de l'article ...
            [authorId] => 2
        )

    [1] => Array
        (
            [id] => 12
            [status] => valid
            [title] => Autre titre
            [creationDate] => 2011-04-05 20:34:20
            [content] => Texte différent ...
            [authorId] => 2
        )

    [2] => Array
        (
            [id] => 16
            [status] => waiting
            [title] => Troisième article
            [creationDate] => 2011-04-10 11:03:44
            [content] => Autre texte ...
            [authorId] => 2
        )

)
						
lastInsertId()

La méthode lastInsertId() retourne la clé primaire du dernier enregistrement créé sur la connexion courante à la base de données.

$db->exec("INSERT INTO article SET title = 'Titre', content = 'Texte', creationDate = NOW()");
$id = $db->lastInsertId();
						
Gestion des transactions

FineDatabase propose des méthodes pour gérer les transactions.

// on ouvre une transaction
$db->startTransaction();

// on effectue diverses requêtes
$db->exec(...);
$db->exec(...);
$db->exec(...);

// traitement conditionnel
if ($something) {
    // la transaction est acceptée
    $db->commit();
} else {
    // la transaction est acceptée
    $db->rollback();
}
						
Échappement des caractères spéciaux

Quand on écrit des requêtes SQL, il faut faire attention aux risques d'injection SQL. Pour y faire face, il faut échapper les caractères spéciaux.

Pour cela, FineDatabase propose la méthode quote(), qui prend un texte en paramètre, et le retourne après avoir échappé chacun de ses caractères spéciaux. Notez bien que cette méthode n'ajoute pas d'apostrophes au début et à la fin de la chaîne ; il vous faudra les ajouter vous-même dans la requête.

Exemple d'utilisation :

$sql = "SELECT * FROM user WHERE name = '" . $db->quote($login) . "'";
$data = $db->queryAll($sql);