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 fais 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 seul fois, lors du lancement de l'application et puis,
stockage dans un fichier
DB_DataObject utilise la dernière de ces trois
méthodes normalement (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.
/*
* Table Definition for group
*/
class DataObjects_Grp extends DB_DataObject {
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
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
/* Static get */
function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('DataObjects_Grp',$k,$v); }
/* the code above is auto generated do not remove the tag below */
###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 à ceci, 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.
[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() and 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'inclue pas des informations supplémentaires (et devrait être
plus petit que l'affichage d'un jeux de résultat large).
/*
* Table Definition for 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');
}
}