version: #3 (current)  |  last edited by: kentpachi  |  on: saturday, february 27, 2010, 1:37 am pst (about 9 years ago)


Qcodo a été conçu pour la création d'application rapidement. L'objectif est de pouvoir fournir des livrables dans des délais assez courts Si vous souhaitez utiliser QCODO dans le cadre d'un projet., il est primordiale de bien concevoir votre modèle de données. Le modèle n'étant jamais fixe il évoluera probablement avec l'application et lors de l'apport de nouvelles fonctionnalités.

Lorsque vous développez des applications php avec la programmation orienté objet, et si vous pratiquez le mapping objet relationnel, vous avez surement été amené à synchroniser vos classes avec vos tables de manière continue. Le principe étant qu'une classe représente une table ou l'intersection de plusieurs table. Si vos tables venaient à être changées vous devrais faire les mêmes changement et mises à jour dans les classes correspondantes.

L'idéal est de pouvoir générer automatiquement les classes depuis la base de données : c'est là que “CodeGenerator” ou Codegen intervient. À partir d'une connexion à une base de données, vous allez pouvoir générer toutes les classes métiers dont vous avez besoin.

L'outils codegen vous permet donc de créer les classes correspondantes et de les implémenter avec quelques méthodes de base que vous êtes libre de modifier ou d'étendre. Codegen prend aussi en compte les modèles relationnels dans le but de respecter l'intégrité réferentiel.

Ainsi le moteur innoDB est parfaitement pris en charge. Vous pouvez passer d'une table à une autre (d'une instance de classe à une autre) en exploitant par exemple les clés étrangères définies dans votre base de données.

Prenons par exemple le modèle suivant :
User (id, name, id_adress Address id, num, streetname)

Exploitant la relation suivante : un utilisateur (user) dispose d'une adresse

L'appel au codegen créera les classes suivantes :

User Address

Admettons maintenant que nous voulons accéder aux informations pour l'utilisateur 1 : Nous aurons le code suivant:

$user = User::LoadById(1);

Ce code nous retourne un instance de la classe User représentant une ligne dans la table user ainsi que l'appel à certains attributs tels que

$user->Name

Cela nous renverra la valeur contenue dans le champs “name” de la table “user” pour l'user dont l'id vaut “1”

Nous aimerions maintenant afficher le nom de la rue (streetname) de l'adresse pour l'utilisateur 1 :

$adresse = Address::LoadById($user->IdAddress); 
echo $adresse->Streetname 

Même principe ici. Nous chargeons la ligne correspondante dans address de la même manière que nous avions chargé l'utilisateur. L'id de l'adresse étant présent dans l'attribut IdAddress de la classe user il nous suffit de le donner en paramètre à la méthode LoadById. Nous pourrions aussi exploiter la contrainte clé étrangère (FK) présente dans la table user pour récupérer directement le nom de la rue :

echo $user->IdAddressObject->Streetname;

Une notion importante est ici abordée : le lazy binding. Au départ nous ne voulions afficher que les informations de l'utilisateur; il n'y avait donc pas d'objet address chargé dans l'attribut id_address de l'utilisateur. Le fait de tenter un accès dessus exécutera une requête à ce moment là. L'avantage est que les requêtes ne sont exécutées que si on a besoin de l'objet spécifique. L'inconvénient par rapport à une requête SQL classique c'est qu'ici deux requêtes sont utilisées pour récupérer des informations qu'une seule requête aidée d'un JOIN pourrait ramener..

Pour parer à cet inconvénient il existe le early binding Si, dès le départ, nous savons que nous allons utiliser des informations présentes dans d'autre table que celle attaquée initialement nous pouvons alors “étendre” la requête sur ces tables et créer la jointure en amont. Il faut utiliser pour cela le moteur de requête objet QQuery, dont voici un exemple :

 $user = User::QuerySingle(QQ::Condition( QQ::Equal(QQN::User()->Id,'1')), QQ::Clause(QQ::Expand( QQN::User()->IdAdresseObject))); 

Avec cette méthode l'attribut id_adress de l'instance user sera directement valoriser avec l'objet correspondant grâce à la jointure materialisée, ici par la clause EXPAND

Un billet complet sera consacré au système d'interrogation QQuery du framework afin de mieux cerner cette philosophie.



Copyright © 2005 - 2019, Quasidea Development, LLC
This open-source framework for PHP is released under the terms of The MIT License.