D'autres types de requêtes sont disponibles.
Création de table
Le framework peut créer la table correspondant à un objet déclaré avec la classe
DatabaseHelper
Il est conseillé de vérifier avant qu'on a bien
indiqué les types
SQL lors de la déclaration de l'objet, sinon ils seront déduits par le framework en fonction du type.
createTablesFromObjects(DBHelper $db, array $objects)
- $db doit être l'instance de DBHelper sur laquelle créer les tables
- $objects doit être une liste d'objet correspondant à des tables à créer. On peut utiliser les objets singletons renvoyés par
Base::singleton()
On peut également déterminer si une ou plusieurs tables n'existent pas avec
missingTables()
Voici un exemple illustrant l'utilisation de ces deux méthodes :
<?php
$db = DBHelper::getInstance(DB_DATABASE_TEST);
$missingObjects = DatabaseHelper::missingTables($db, array('City', 'Person')); // va exécuter la requete :
// SELECT t0.table_name as table_name
// FROM information_schema.tables t0
// WHERE t0.table_name IN ('city', 'person') AND t0.table_schema = database()
DatabaseHelper::createTablesFromObjects($db, $missingObjects); // si les tables sont manquantes, va exécuter :
// CREATE TABLE city (
// id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
// city_name VARCHAR(50) NOT NULL,
// country VARCHAR(50) NOT NULL,
// date_mise_a_jour DATETIME NOT NULL
// ) ENGINE=InnoDB
// puis
// CREATE TABLE person (
// id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
// person_name VARCHAR(50) NOT NULL,
// city INT(11) NOT NULL
// ) ENGINE=InnoDB
Le code de déclaration des classes
City et Person est visible ici
Lors de la création des tables, il est également possible d'initialiser les tables en créant automatiquement certains objets.
Pour cela il faut implémenter la méthode
initAfterCreateTable dans l'objet et renvoyer la liste des objets à créer.
Ajout d'index
Il est possible d'ajouter des index lors de la création de la table en exécutant des requêtes en dur dans
initAfterCreateTable.
Par exemple :
<?php
public function initAfterCreateTable(DBHelper $db) {
$db->execSQL('ALTER TABLE ['.__CLASS__.'] ADD INDEX `city_country` (`city_name` ASC, `country` ASC)');
...
return NULL;
}