Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Db
Zend_Db Forum d'entraide pour le composant Zend_Db du Zend Framework (création de requêtes, abstraction, ORM etc.). Avant de poster -> FAQ Zend_Db.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/10/2011, 09h30   #1
Futur Membre du Club
 
Inscription : juin 2005
Messages : 166
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 166
Points : 18
Points : 18
Par défaut Compatibilité entre modèle objet Zf et les jointures

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 :
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 :

Code :
1
2
3
4
5
 
SELECT *
FROM user_info
JOIN user_profile
ON user_info.user_id = user_profile.user_id
En une requête j'aurais ma liste d'enregistrement.


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 :

Code :
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();
Mon problème est que Zf ne fait pas de jointure SQL mais fait 2 selects.

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.
iowa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 22h37   #2
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Oui tu peux utiliser join ou joinLeft joinNatural joinRight
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 07h59   #3
Futur Membre du Club
 
Inscription : juin 2005
Messages : 166
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 166
Points : 18
Points : 18
Ça s'apparente au full loading ?

http://baptiste-wicht.developpez.com.../full-loading/
iowa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 20h25   #4
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Pas bligatoirement tu peux faire comme tu veux mais regarde la documentation officiel
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 12h53   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Cette discussion est une démonstration supplémentaire qu'il est bien plus pratique d'utiliser des requêtes en SQL natif que le pseudo SQL des ORM !

Ne vous embêtez pas avec ce truc inutilement compliqué !
Écrivez les requêtes en SQL natif et soumettez-les directement via un Zend_Db_Statement.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 21h59   #6
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Cela ne demontre rien du tout, tout depend de l utilisation.

Ce que tu dis est comme utiliser PDO sans préparer les requêtes.
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 22h01   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par 5h4rk Voir le message
Ce que tu dis est comme utiliser PDO sans préparer les requêtes.
On peut faire des requêtes préparées en SQL !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 23h15   #8
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
C'est un exemple.
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h36.


 
 
 
 
Partenaires

Hébergement Web