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

Doctrine2 PHP Discussion :

Problème à la récupération des objets associés


Sujet :

Doctrine2 PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 39
    Points
    39
    Par défaut Problème à la récupération des objets associés
    bonsoir,

    j'ai un souci pour récupérer des objets associés. J'ai pourtant suivie la doc http://symfony.com/fr/doc/master/book/doctrine.html

    le contexte est à peu près la même que la doc, j'ai une entité fichier qui est liée à une entité type fichier. Le but étant de récupérer les données d'un fichier et donc le libellé du type fichier.

    Et c'est ici que je coince. J'arrive très bien à récupérer tout ce qui est lié au fichier ( nom du fichier, le path, la date) mais le libellé du type pas du tout.

    mon contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Récupération de l'objet user connecté
    		$user = $this->get('security.context')->getToken()->getUser();
    		// Récupération de l'id du user connecté
    		$iduser = $user->getId();
    		// La requête affichant tout les fichiers liés à l'utilisateur connecté
    		$repository = $this->getDoctrine()
    			->getRepository('SpinnakerProBundle:Fichier');
    		$fichier = $repository->findByuser($iduser);
     
    		$NomType = $fichier->getTypefichier()->getNomTypeFichier();
     
    		// Affichage de la page 
    		return $this->get('templating')->renderResponse('SpinnakerProBundle:Pro:compte.html.twig',array(
    		 'fichier' => $fichier));
    symfony m'indique que la fonction getTypeFichier() ne peut pas être appelée sur un non-objet. donc si je comprend bien c'est pas sur "$fichier" mais je vois quoi mettre d'autre. Si vous pouviez m'éclairer sa serai sympa

    Merci d'avance

    Cordialement

  2. #2
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    findByUser ne te retourne pas un tableau ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Je pense que si car ensuite dans ma vue je fais :
    Code : 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
    <h1>Liste des fichiers</h1>
    		<table>
    			<tr>
    				<th> Date de dépôt </th>
    				<th> Nom : </th>
    				<th> Type de fichier : </th>
    				<th> Nom du fichier : </th>
    				<th> Télécharger </th>
    			</tr>
    			{% for elem in fichier %}
    			<tr>
    				<td>{{ elem.dateDepot.format('j.M.Y') }}</td>
    				<td>{{ elem.nomFichier }}</td>
     
    			</tr>
    			{% else %}
    			<p>Aucune fichier n'a été trouvée.</p>
    			{% endfor %}
    		</table>
    et la date et le nom s'affiche bien.

  4. #4
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Ben alors tu a ta réponse...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    je comprend ce que tu veux me dire, enfin j'espère. Mais sa résolve pas mon problème pour récupéré le libellé du type fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $NomType =$fichier->getTypefichier()->getNomTypeFichier();
    si $fichier c'est un tableau, effectivement je comprend l'erreur que symfony m'envoie en me disant que ma fonction ne peux se faire sur un nom-objet.

    du coup je vois pas quel objet je peux mettre?

  6. #6
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    ben si tes fichiers ont tous le même type tu peux toujours récupérer le type du premier fichier du tableau...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(isset($fichier[0])){
       $NomType = $fichier[0]->getTypefichier()->getNomTypeFichier();
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Bah justement non un fichier peut être de type rapport, facture...

    Je comprend pas pourquoi je peux pas faire une sorte de jointure juste pour récupéré le libellé (rapport, facture...) car dans mon fichier y a bien typefichier_id.

  8. #8
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Je sais pas ce que tu veux faire mais tout est récupérable, que ce soit dans le controller ou dans le template :
    Code : 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
    20
    21
     
    <h1>Liste des fichiers</h1>
    		<table>
    			<tr>
    				<th> Date de dépôt </th>
    				<th> Nom : </th>
    				<th> Type de fichier : </th>
    				<th> Nom du fichier : </th>
    				<th> Télécharger </th>
    			</tr>
    			{% for elem in fichier %}
    			<tr>
    				<td>{{ elem.dateDepot.format('j.M.Y') }}</td>
    				<td>{{ elem.nomFichier }}</td>
                                    <td>{{ elem.Typefichier.NomTypeFichier }}</td>
     
    			</tr>
    			{% else %}
    			<p>Aucune fichier n'a été trouvée.</p>
    			{% endfor %}
    		</table>

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    tout d'abord je te remercie de prendre du temps pour résoudre mon problème

    lorsque je fais {{ elem.Typefichier }} j'ai l'erreur to_string

    car elem.Typefichier correspond à la clé étrangère. et si je fais {{ elem.Typefichier.NomTypeFichier }} la methode nomtypefichier existe pas.

    donc je vois pas comment faire...

  10. #10
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Je connait pas ton model de donnée mais il me semble qu'avant toute chose on doit mettre cette instruction en commentaire de l'entité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     * @ORM\HasLifecycleCallbacks()
    Peux tu me montrer quelle est la relation entre tes entités ?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    mon entité Fichier :
    Code : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    class Fichier
    {	
    [...]
        /**
         * @ORM\ManyToOne(targetEntity="Spinnaker\ProBundle\Entity\TypeFichier", inversedBy="fichiers")
         * @ORM\JoinColumn(name="typefichier_id", referencedColumnName="id")
         */
        protected $typefichier;
     
        /**
         * Set typefichier
         *
         * @param Spinnaker\ProBundle\Entity\TypeFichier $typefichier
         * @return Fichier
         */
        public function setTypefichier(\Spinnaker\ProBundle\Entity\TypeFichier $typefichier = null)
        {
            $this->typefichier = $typefichier;
     
            return $this;
        }
     
        /**
         * Get typefichier
         *
         * @return Spinnaker\ProBundle\Entity\TypeFichier 
         */
        public function getTypefichier()
        {
            return $this->typefichier;
        }
    pour mon entité TypeFichier
    Code : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    class TypeFichier
    {
    [...]
    /**
         * @ORM\OneToMany(targetEntity="Spinnaker\ProBundle\Entity\Fichier", mappedBy="typefichier")
         */
        protected $fichiers;
     
        public function __construct()
        {
            $this->fichiers = new ArrayCollection();
        }
     
        /**
         * Add fichiers
         *
         * @param Spinnaker\ProBundle\Entity\Fichier $fichiers
         * @return TypeFichier
         */
        public function addFichier(\Spinnaker\ProBundle\Entity\Fichier $fichiers)
        {
            $this->fichiers[] = $fichiers;
     
            return $this;
        }
     
        /**
         * Remove fichiers
         *
         * @param Spinnaker\ProBundle\Entity\Fichier $fichiers
         */
        public function removeFichier(\Spinnaker\ProBundle\Entity\Fichier $fichiers)
        {
            $this->fichiers->removeElement($fichiers);
        }
     
        /**
         * Get fichiers
         *
         * @return Doctrine\Common\Collections\Collection 
         */
        public function getFichiers()
        {
            return $this->fichiers;
        }

  12. #12
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Il faut que tu ajoute la méthode getNomTypeFichier à ton entité TypeFichier et que tu ajoute l'annotation que j'ai posté précédemment avant la déclaration de ton entité fichier.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    j'ai déjà la méthode getNomTypeFichier et l'annotation aussi.

    [edit]

    J'ai fait une petite avancé sa serai mon " findbyuser" qui empêcherais la deuxième requête de fonctionner. Elle fonctionnerait seulement si dans la première c'est un "find".

    bref y aurait-il un moyen de faire cette requête :

    SELECT `nomFichier`,`dateDepot`, `nomtypefichier` FROM `fichier`, `typefichier` WHERE `user_id` = 7 and `fichier`.`type_id` = `typefichier`.`id`;

    car sa serai exactement sa que je voudrais avec pour le 7 ma variable $iduser.

    Merci
    Cordialement

  14. #14
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Citation Envoyé par LinC49 Voir le message
    lorsque je fais {{ elem.Typefichier }} j'ai l'erreur to_string
    Cela veux juste dire que tu veux afficher l'objet entity et qu'il va chercher la méthode to_string dans ton objet pour essayer de l'affiché.... méthode qui n'existe pas.

    Implémente la méthode to_string.

    Au vu de tes entités, utilise plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {{ elem.typefichier }}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {{ elem.typefichier.nomtypefichier }}
    tu dois avoir une faute dans le nom des attributs. Met le nom exact des attributs de tes entités...


    sinon pour faire ta requête tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ->findBy(array('user' => $iduser));
    Qui va retourner aussi un tableau que tu va devoir parcourir pour en récupérer les objets et enfin afficher les attributs et attributs lié...

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    J'ai bien ré-écrit mes attributs pour ne pas faire de faute par la suite.

    J'ai enfin réussi un gros gros merci, 3 jours pour seulement un ajout d'une méthode __toString vraiment symfony aura eu ma peau! lool

    Je résume pour les gens comme moi qui galère pour au final peu de chose.

    pas besoin de 2ème requête car dès la 1ère on a accès à tout même ce qui concerne les clés étrangères.

    il suffit par contre d'ajouter une méthode __toString, pour ma part c'est d'afficher le libeller de mon type fichier voila ma méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function __toString()
    	{
     
    		$this->getNomtypefichier();
    		return $this->getNomtypefichier();
    	}
    Je vous remercie mille fois

    Cordialement

    A bientôt

  16. #16
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Bonne continuation

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

Discussions similaires

  1. Récupération des objets d'une association bidirectionnelle
    Par mbenameur dans le forum Doctrine2
    Réponses: 5
    Dernier message: 28/12/2012, 16h49
  2. Réponses: 2
    Dernier message: 31/03/2006, 09h23
  3. Réponses: 3
    Dernier message: 06/10/2005, 16h46
  4. [hibernate]Problème de récupération d'objet...
    Par roxx62 dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2005, 11h36
  5. Réponses: 8
    Dernier message: 12/05/2005, 08h16

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