IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Meilleure façon de récupérer infos d'une foreign key dans un objet ? [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 90
    Points : 69
    Points
    69
    Par défaut Meilleure façon de récupérer infos d'une foreign key dans un objet ?
    Hello tout le monde !

    Je viens vous voir pour une petite question. Je chipote actuellement avec PHP et j'avais une question concernant la récupération d'infos propres à une clé étrangère depuis la base de donnée.

    Imaginons que j'ai une table 'News' en BD avec une foreign key 'Auteur' qui vient de ma table 'Users'. De l'autre côté en PHP j'ai ma classe News également qui possède un attribut auteur, mais à quoi correspond t-il exactement ?

    Moi je vois plusieurs choix possibles :

    - Lorsque que je fais une requête pour récupérer une news, dans cette requête je fais une jointure entre mes deux tables et récupére l'info qui m'intéresse
    - Instancier un objet User dans l'attribut de ma classe, mais je ne vois pas trop comment retourner le tout avec PDO depuis une function 'GetNews'
    - Dans le constructeur de ma classe News, instancier un User pour aller rechercher les infos

    Quelle est la meilleure solution ? Ou bien y en a-t-il une autre que je n'aurais pas penser ?

    Merci d'avance

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Si c'est un TP, on en a déjà parlé ici...

    https://www.developpez.net/forums/d1...-objet-metier/

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 90
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Si c'est un TP, on en a déjà parlé ici...

    https://www.developpez.net/forums/d1...-objet-metier/
    Merci mais ça ne m'aide pas beaucoup, y'a pas de réelle réponse au sujet et au final je ne suis pas plus avancé...

    En attendant de trouver mieux, j'ai "trouver" une solution bien dégeu en recréant une nouvelle connexion et je passe l'ID de la FK en instanciant un objet avec la clé étrangère venant de l'autre table

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    En me basant sur le fonctionnement d'ORM existants, je dirais que tu as 2 options :
    • le mode EAGER (je ne sais pas trop comment appeler ça en français) : en gros, tout ce qui est récupérable est récupéré. En pratique, ça consiste à faire systématiquement une jointure sur la table liée et remonter les informations du sous-objet
    • le mode LAZY (paresseux) : on remonte le script minimum et on fait une requête indépendante sur la table liée uniquement quand on a besoin du sous-objet.


    En général, on choisit entre les 2 modes au cas par cas en fonction de la quantité de données concernées et de la fréquence d'utilisation.
    Si ton objet Auteur ne continent pas beaucoup de champs et qu'il est souvent utilisé, autant le récupérer tout de suite.
    Si en revanche, il est très lourd (beaucoup de colonnes, ou pire, des colonnes BLOB), ou qu'il ne sert quasiment jamais, autant le mettre en mode LAZY.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 90
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par Celira Voir le message
    En me basant sur le fonctionnement d'ORM existants, je dirais que tu as 2 options :
    • le mode EAGER (je ne sais pas trop comment appeler ça en français) : en gros, tout ce qui est récupérable est récupéré. En pratique, ça consiste à faire systématiquement une jointure sur la table liée et remonter les informations du sous-objet
    • le mode LAZY (paresseux) : on remonte le script minimum et on fait une requête indépendante sur la table liée uniquement quand on a besoin du sous-objet.


    En général, on choisit entre les 2 modes au cas par cas en fonction de la quantité de données concernées et de la fréquence d'utilisation.
    Si ton objet Auteur ne continent pas beaucoup de champs et qu'il est souvent utilisé, autant le récupérer tout de suite.
    Si en revanche, il est très lourd (beaucoup de colonnes, ou pire, des colonnes BLOB), ou qu'il ne sert quasiment jamais, autant le mettre en mode LAZY.
    Merci, je pense que je vois un peu comment ça se passe

    J'ai fait une première version du genre qui fonctionne pas trop mal.
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $requete = $this -> db -> prepare('SELECT n.id, n.titre, n.contenu, n.image_titre imageTitre, n.fk_jeu jeu, n.fk_auteur auteur, n.date_publication datePublication FROM news n WHERE n.id = :id');
     
    			$requete -> bindParam(':id', $id);
    			$requete -> setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'News');
    			$requete -> execute();
     
    			$news = $requete -> fetch();
     
    			// Récupération de l'utilisateur
    			$manager = new UserManagerPDO($this -> db);
    			$auteur = $manager -> GetUser((int) $news -> GetAuteur());
     
    			// Formatage de l'objet à retourner
    			$news -> SetAuteur($auteur -> GetPseudo());
    			$news -> SetDatePublication(new DateTime($news -> GetDatePublication()));
     
    			$requete -> closeCursor();
     
    			return $news

    il me reste à adapter le code dans un second temps pour retourner un objet User complet au lieu de simplement le pseudo dans ce cas-ci et je pense que je serai bon

    EDIT : Après un petit test, pour renvoyer l'objet complet d'un auteur, j'ai simplement adapté le setter Auteur sur mon objet News pour qu'il prenne en paramètre un objet User et maintenant dans mon code je peux faire $news -> GetAuteur() -> Get Pseudo() pour avoir exactement ce dont j'ai besoin avec la manière que je voulais !

    Encore grand merci pour l'aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer une foreign key dans sqlplus
    Par chfakht dans le forum SQL
    Réponses: 1
    Dernier message: 14/04/2014, 23h14
  2. Réponses: 4
    Dernier message: 11/03/2011, 18h04
  3. récupérer info d'une table par requête..
    Par the_youpi dans le forum SQL
    Réponses: 4
    Dernier message: 20/06/2007, 17h11
  4. [FTP] Meilleur façon de récupérer du code d'un serveur
    Par maximenet dans le forum Langage
    Réponses: 5
    Dernier message: 27/12/2006, 17h43
  5. récupérer info d'une 'sous' form
    Par astano dans le forum Langage
    Réponses: 8
    Dernier message: 29/03/2006, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo