Tu as deux approches, toutes les deux respectables.
La première qui est basée sur la base de données, les procédures stockées et les vues. C'est une très bonne approche. Elle est compatible avec doctrine et son modèle, il faut juste faire coïncider les classes et les vues (bon, j'ai jamais essayé, mais cela devrait marcher). L'avantage au niveau performance est certains. L'inconvénient est de limiter à un type de base (impossible d'avoir l'application en MySql, sauf pour un petit client qui souhaiterait un sqlite, et un autre qui n'utilise qu'Oracle)... L'autre inconvénient est d'avoir à maîtriser au moins deux langages, le php et le sql transactionnel (voir plusieurs, ils ne sont pas tous exactement).
La deuxième est basée sur le modèle objet de l'ORM doctrine. 90% est bâti par un schema.yml bien construit, le reste est adaptable par quelques méthodes à modifier ou compléter dans le modèle. Les avantages sont inverses à ceux du précédant.
Pour ce qui est des liaisons, en règles générale, les liaisons 1-1 ne sont pas nécessaires. Elles résultent souvent d'une analyse non optimisées. Bien qu'il puisse arriver que l'on en trouve, elles constitues une minorité dans les liaisons.
Pour les liaisons 1-N qui constituent la majorité des relations dans une base, doctrine est parfaitement adapté à l'accès aux données, même si l'accès n'est pas nécessairement optimisé "naturellement" les performances peuvent être adaptées (en nombre de requêtes) dans un deuxième temps.
Un exemple pour le blog, on va avoir deux tables, celle des sujets et celle des commentaires. Le shema.yml pourrait ressembler à ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
sujet:
columns:
objet: string(150)
texte: string
commentaire
columns:
comment: string(200)
sujet_id: integer
relations:
sujet:
local: sujet_id
foreign: id
foreignAlias: commentaires |
Un peu d'explications : - Si on ne définit pas de clef primaire, doctrine s'en charge, de type integer auto-incrémenté.
- Il ne sert à rien de définir les options par défaut
- Pour la relation :
- local indique le nom du champ local (la table où la relation est définie)
- foreign indique le nom de la clef de l'autre côté de la liaison, ici id qui est créé automatiquement
- foreignAlias indique le nom par lequel la relation sera vue de l'autre côté de la relation

- enfin, le nom de la relation (ici sujet) indique le nom de la table opposée et le nom que cette relation aura dans le modèle objet.
Quelques exemples :- pour un objet $commentaire, on peut récupérer le sujet (côté 1 de la relation) par $commentaire->getSujet() qui retourne un objet doctrine_record avec le sujet. On peut donc récupérer l'objet du sujet par $commentaire->getSujet()->getObjet().
- pour un objet $sujet, on peut récupérer tous les commentaires avec $sujet->getCommentaires() qui retourne un doctrine_collection des enregistrements des commentaires.
Le seul défaut est que si l'on a 10 commentaires pour un sujet, on va générer 11 requêtes, ce qui n'est pas optimisé ! Ce avec la requête de base de
$sujet = doctrine_querry->from('sujet s')->where('s.id = ?', 1);
Ceci peut fonctionner avec une seul requête en l'optimisant un peu
$sujet = doctrine_querry->from('sujet s')->leftjoin('s.commentaires c')->where('s.id = ?', 1)
et il n'y a plus alors qu'une requête.
Partager