Bonjour à tous,
J'ai deux tables :
- user_info : la table des utilisateurs (email, password...)
- user_profile : la table profil des utilisateurs (nom, prénom)
user_info et user_profile sont reliées entres elles par le champ user_id commun au deux.
J'essaie d'utiliser au maximum les concepts fournis par Zf.
Par exemple, pour la table user_info, j'ai :
- class UserInfo() : qui représente un enregistrement particulier (c'est l'endroit ou je mets les getters/ setters)
- class UserInfoMapper() : qui me permet d'effectuer des opérations sur cette table (par exemple enregistrer un objet avec la méthode save, ou hydrater à partir d'un Zend_Db_Row, un objet UserInfo)
- class DbTable_UserInfo() : qui représente la table (me permet de déclarer la PK etc...)
J'utilise typiquement ces objets comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $user_info_map = new UserInfoMapper(); $user_info = $user_info_map->find(1); // $user_info sera une instance de UserInfo() et non pas un Zend_Db_Row
Et je voudrais par exemple à partir de user_info récupérer le profil.
En SQL ça donnerait :
En une requête j'aurais ma liste d'enregistrement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT * FROM user_info JOIN user_profile ON user_info.user_id = user_profile.user_id
Maintenant, si je passe par Zend_Db_Relationships et que je déclare les références dans ma DbTable_UserProfile.
Pour avoir les profils je ferais :
Mon problème est que Zf ne fait pas de jointure SQL mais fait 2 selects.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $ui = new DbTable_UserInfo(); $rowset = $ui->find(1); $row = $rowset->current(); $profiles = $row->findDependentRowset('DbTable_UserProfile', 'UserInfo'); $profile = $profiles->current();
Donc pour 3 utilisateurs, j'aurais :
- Un select * from user_info
- 3 select * from user_profile
Pour n utilisateurs, j'aurais : 1 + n requêtes. Alors que j'aurais pu faire 1 requête.
C'est sur que pour 3 utilisateurs avec deux table liées, ça semble dérisoire mais sur 4 tables liées, ça monte à : 1 + 4n
Et perso, pour 20 lignes, faire 81 requêtes, c'est chaud :O
Est-ce possible de faire moins ?
Merci beaucoup.
Cdt.
Partager