Construction automatique et schéma de base de données

Construction automatique et schéma de base de données – Création des classes de base et du schéma de la base de données

Que fait le constructeur automatique ? (createTables.php)

Une des fonctionnalités essentielles de l'outil de construction SQL est d'avoir une compréhension de la structure de la base de données, donc les entiers peuvent être vérifiés et les chaînes de caractères peuvent être échappées. Il y a différentes façons d'exécuter des requêtes sur une base de données pour une structure de table

  • sur chaque requête SQL

  • à l'initialisation de chaque page web.

  • Une seule fois, lors du lancement de l'application et puis, stockage dans un fichier

DB_DataObject utilise normalement la dernière de ces trois méthodes (voir la section sur les alternatives), il utilise la fonction parse_ini_file pour lire le fichier, donc, il est relativement rapide. Sinon, il est nécessaire de passer par une phase d'initialisation de DB_DataObject avant de pouvoir l'utiliser.

L'autre concept principal de DB_DataObject est que vous travaillez avec une extension de la classe DB_DataObject, ce qui fait que tout ce qui est relatif à la table fonctionne. L'initialisation de cette classe pour une grosse base de données peuvent être couteux en terme de temps d'exécution, donc le fichier createTables.php construira automatiquement le squelette pour tous ces fichiers de la classe.

Pour démarrer le constructeur automatique, allez simplement dans le dossier pear/DB/DataObject/ et tapez (si vous êtes sous Windows) la ligne de commande suivante : c:\php4\php.exe createTables.php myconfig.ini. Cela lira votre fichier de configuration et génèrera tous les classes de base ainsi que les fichiers de définitions de données.

Depuis la version 1.5, vous pouvez utiliser l'option "proxy = full", ce qui fera que DataObjects créera des classes et des schémas à la volée, plutôt que d'utiliser un fichier ini ou des classes de pré-construction.

définition de la classe par défaut

La classe générée par défaut ressemble à ceci.

Une classe étendue générée

<?php
/*
* Définition de la table 'group'
*/

class DataObjects_Grp extends DB_DataObject {

    
###START_AUTOCODE
    /* le code ci-dessous est généré automatiquement, n'effacez pas la balise ci-dessus */

    
var $__table='group';                             // table name
    
var $id;                              // int primary_key
    
var $name;                            // string
    
var $grp_owner;                       // int
    
var $official;                        // string
    
var $street;                          // string
    
var $postcode;                        // string
    
var $city;                            // string
    
var $homepage;                        // string
    
var $email;                           // string
    
var $extra;                           // blob

    /* Récupération statique */
    
function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('DataObjects_Grp',$k,$v); }


    
/* le code ci-dessous est généré automatiquement, n'effacez pas la balise ci-dessous */
    ###END_AUTOCODE
}
?>

La classe définie le nom de la table, et les commentaires quelques colonnes de la table suivant vos préférences, il ajoute aussi la méthode staticGet() qui peut être utilisée pour récupérer rapidement des lignes simples de l'objet. Vous devrez ajouter votre code spécifique à la table après le tag ###END_AUTOCODE.

Avant la version 1.6, une méthode nommée __clone avait été créée ; PHP5 ayant imposé d'utiliser $x = clone($y);, cette méthode a été supprimée. DataObjects crée maintenant une fonction factice de clonage (si nécessaire), pour activer la compatibilité ascendante.

Fichier de schéma de base de données

Le fichier de définitions de base de données généré par défaut ressemble à celui ci-dessous. Il est situé dans le dossier renseigné par l'option de configuration "schema_location" et son nom est identique au nom de la base de données.

Si vous renommez la base de données, vous devez également regénérer le fichier ou le copier pour correspondre au nouveau nom.

Si vous changez la structure de la base de données (e.g ajout d'une colonne ou changement du type), vous devez regénérer le fichier contenant le schéma, en utilisant le fichier createTables.php. Actuellement, cela n'est pas fait automatiquement (bien que cela devrait être ajouté prochainement).

Vous ne devriez pas éditer ce fichier manuellement (sinon, tous les changements risqueraient d'être perdus lors de la regénération). Vous pouvez effacer les clés d'une table en utilisant l'option de configuration "sequence_{table} = key" ou en définissant la méthode sequenceKey() de votre classe étendue.

Fichier de configuration de base de données

[group]
id = 129
name = 130
grp_owner = 129
official = 130
street = 130
postcode = 130
city = 130
homepage = 130
email = 130
extra = 130

[group__keys]
id = N

Le bloc indique soit les tables et leur type de champs par addition binaire (1=integer,2=string,128=not null, donc 129=integer et not null) soit une liste de clés pour chaque table. Vous ne devriez pas avoir à éditer ce fichier.

Alternatives à l'utilisation d'un fichier de schéma

Il est possible d'utiliser DataObjects sans fichier de schéma ; cela, de deux façons :

  • en définissant les méthodes table() and keys() dans une extension de la classe

  • en passant un tableau aux méthodes table() and keys() lorsque vous avez une instance de dataobjects

La seconde méthode est détaillé dans la page des méthodes keys() et tables().

Ci-dessous, une classe écrite manuellement qui n'utilise pas un fichier de schéma schema.ini.

Elle est prévue pour retourner une valeur depuis une méthode, plutôt qu'une variable objet, donc, l'affichage de print_r(), qui n'inclu pas d'informations supplémentaires (et devrait être plus petit que l'affichage d'un jeux de résultat large).

Une extension de classe écrite manuellement

<?php
/*
* Définition de la table 'group'
*/

class DataObjects_Grp extends DB_DataObject {

    
// vous pouvez définit cela vous-même

    
var $__table='group';                             // nom de la table
    
var $id;                              // int primary_key
    
var $name;                            // string
    
var $bday;                            // string
    
var $last;                            // datetime
    
var $active;                          // tinyint(1)
    
var $desc;                            // text
    
var $photo;                           // blob

    // ceci est utile avec un fichier généré automatiquement

    /* récupération statique */
    
function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('DataObjects_Grp',$k,$v); }

    
// maintenant, définissez votre structure de table
    // les clés sont les noms de colonnes, les valeurs, les tpyes
    
function table() {
        return array(
            
'id'     => DB_DATAOBJECT_INT,
            
'name'   => DB_DATAOBJECT_STR,
            
'bday'   => DB_DATAOBJECT_STR DB_DATAOBJECT_DATE,
            
'last'   => DB_DATAOBJECT_STR DB_DATAOBJECT_DATE DB_DATAOBJECT_TIME,
            
'active' => DB_DATAOBJECT_INT DB_DATAOBJECT_BOOL,
            
'desc'   => DB_DATAOBJECT_STR DB_DATAOBJECT_TXT,
            
'photo'  => DB_DATAOBJECT_STR DB_DATAOBJECT_BLOB,
        );
    }

    
// maintenant, définissez les clés
    
function keys() {
        return array(
'id');
    }

}
?>

Définition des options par défaut d'accès à une base de données (Previous) Chargement automatique et instanciation d'une classe, basée sur le nom d'une table (Next)
Last updated: Sun, 29 Aug 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: alan@akbkhome.com
I forgot to add the example for the createTables.php ini file

To create the code in the /tmp folder (so you can copy it into place later)

use this as 'create.ini'
[DB_DataObject]

database = mysql://root:@localhost/thedb
schema_location = /tmp/myproj/DataObjects
class_location = /tmp/myproj/DataObjects
require_prefix = MyProject/DataObjects/
class_prefix = MyProject_DataObjects_

then run
php createTables.php create.ini