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

Symfony PHP Discussion :

[Symfony 3.3.6] Récupération de données


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut [Symfony 3.3.6] Récupération de données
    Bonjour à tous,J'ai un souci de récupération de mes données. En effet, j'ai 2 entités : Theme et Category qui sont liées par une relation ManyToOne bidirectionnelle. Ça devrait être une relation ManyToMany mais la base de données a été conçue comme ça et je ne peut pas revenir là-dessus. Mon problème quand j'essaye de récupérer mes infos du côté inverse de la relation je n'obtiens rien. Mes requêtes me renvoient un array vide et je ne sais pas comment contourner ce problème. J'avoue c'est un problème particulier car dans mon entité propriétaire Category qui contient le champ (qui est supposé être la clé étrangère) qui est un type varchar(100) et qui contient les identiants des Thèmes (Entité Theme). Voici un exemple du contenu de ce champ :

    theme_id
    29,34
    29,31
    29
    21
    29,34
    25,33,34


    Mon Controller est le suivant :
    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
    
    class PostController extends Controller
    {
        public function viewAction(Request $request)
        {
            $id = $request->query->get('id');
            $em = $this->getDoctrine()->getManager();
            $tab = [];
            $themes = $em->getRepository(Theme::class)->findBy(array('id' => $id));
            foreach ($themes as $theme) {
                $theme = $em->getRepository(Theme::class)->find($theme->getId());
                foreach ($theme->getCategories() as $cats) {
                    if ($cats != null) {
                        array_push($tab, $cats);
                    }
                }
            }
     
            return $this->render('content.html.twig', array(
                'themes' => $themes,
                'cats' => $tab
            ));
     
        }
    }
    Ma vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    {% for theme in themes %}
        <h2>{{ theme.name }}</h2>
     
        {% for cat in theme.cats %}
            <div>
                <p>{{ cat.title }}</p>
                <p>{{ cat.content }}</p>
            </div>
        {% endfor %}
    {% endfor %}
    Mes entités:
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    // Entité Theme:
     
     
    namespace AppBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Theme
     *
     * @ORM\Table(name="theme")
     * @ORM\Entity(repositoryClass="AppBundle\Repository\ThemeRepository")
     */
    class Theme
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=255)
         */
        private $name;
     
        /**
         * @ORM\OneToMany(targetEntity="AppBundle\Entity\Category", mappedBy="theme")
         */
        private $categories;
     
        /**
         * Get id
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set name
         *
         * @param string $name
         *
         * @return Theme
         */
        public function setName($name)
        {
            $this->name = $name;
     
            return $this;
        }
     
        /**
         * Get name
         *
         * @return string
         */
        public function getName()
        {
            return $this->name;
        }
        /**
         * Constructor
         */
        public function __construct()
        {
            $this->categories = new \Doctrine\Common\Collections\ArrayCollection();
        }
     
        /**
         * Add category
         *
         * @param \AppBundle\Entity\Category $category
         *
         * @return Theme
         */
        public function addCategory(\AppBundle\Entity\Category $category)
        {
            $this->categories[] = $category;
            $this->categories->add($category);
            $category->setTheme($this);
     
            return $this;
        }
     
        /**
         * Remove category
         *
         * @param \AppBundle\Entity\Category $category
         */
        public function removeCategory(\AppBundle\Entity\Category $category)
        {
            $this->categories->removeElement($category);
        }
     
        /**
         * Get categories
         *
         * @return \Doctrine\Common\Collections\Collection
         */
        public function getCategories()
        {
            return $this->categories;
        }
    }
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    // Entité Category : 
    namespace AppBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Category
     
     *
     * @ORM\Table(name="category")
     * @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
     */
    class Category
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="title", type="string", length=255)
         */
        private $title;
     
        /**
         * @var string
         *
         * @ORM\Column(name="content", type="text")
         */
        private $content;
     
        /**
         * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Theme", inversedBy="categories")
         * @ORM\JoinColumn(name="id", referencedColumnName="id")
         */
        private $theme;
     
        /**
         * Get id
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set title
         *
         * @param string $title
         *
         * @return Category
         */
        public function setTitle($title)
        {
            $this->title = $title;
     
            return $this;
        }
     
        /**
         * Get title
         *
         * @return string
         */
        public function getTitle()
        {
            return $this->title;
        }
     
        /**
         * Set content
         *
         * @param string $content
         *
         * @return Category
         */
        public function setContent($content)
        {
            $this->content = $content;
     
            return $this;
        }
     
        /**
         * Get content
         *
         * @return string
         */
        public function getContent()
        {
            return $this->content;
        }
     
        /**
         * Set theme
         *
         * @param \AppBundle\Entity\Theme $theme
         *
         * @return Category
         */
        public function setTheme(\AppBundle\Entity\Theme $theme = null)
        {
            $this->theme = $theme;
     
            return $this;
        }
     
        /**
         * Get theme
         *
         * @return \AppBundle\Entity\Theme
         */
        public function getTheme()
        {
            return $this->theme;
        }
    }
    Merci par avance !

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $themes = $em->getRepository(Theme::class)->findBy(array('id' => $id));
            foreach ($themes as $theme) {
                $theme = $em->getRepository(Theme::class)->find($theme->getId());
                foreach ($theme->getCategories() as $cats) {
    Plusieurs thèmes en recherchant par id ??
    Bizarre ce code ça devrait plutôt être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $theme = $em->getRepository(Theme::class)->find($id);
    $cats = $em->getRepository(Category::class)->find($theme->getId());
                foreach ($cats as $cat) {
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Bonjour @jfsenechal,

    Merci d'avoir pris le temps de me répondre.
    J'ai utilisé la méthode findBy() parce que j'ai deux paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $themes = $em->getRepository(Theme::class)->findBy(array('id' => $id, 'locale' => $_locale));
    C'était juste un oubli de le rajouter.
    Je récupère bien l'ID d'un Thème grâce à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($theme->getId());
    .

    Par contre je ne récupère pas les catégories liées à un Thème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    foreach ($cats as $cat) {
    }
    
    
    return $this->render('content.html.twig', array(
       'themes' => $themes,
       'cat' => $cat
    ));
    J'ai l'erreur suivante : Notice: Undefined variable: cat

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Par défaut
    Pq faire ça ?

    foreach ($themes as $theme) {
    $theme = $em->getRepository(Theme::class)->find($theme->getId());
    Il suffit de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     foreach ($themes as $theme) {
                foreach ($theme->getCategories() as $cats) {

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Re @jfsenechal,

    C'est ce que j'avais fait dans mon code précédent. J'ai juste rajouter cette ligne qui ne sert finalement à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $theme = $em->getRepository(Theme::class)->find($theme->getId());
    En reprenant mon code posté antérieurement :

    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
    
     $tabs = [];
     
    $themes = $em->getRepository(Theme::class)->findBy(array('id' => $id, 'locale' => $_locale));
    
    foreach($themes as $theme) {
       foreach ($theme->getCategories() as $cats) {
          if($cats != null) {
             array_push($tabs, $cats);
          }
       }
    }
    
    
    return $this->render('content.html.twig', array(
       'themes' => $themes,
       'cats' => $tabs
    ));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    {% for theme in themes %}
        <h2>{{ theme.name }}</h2>
     
        {% for cat in theme.cats %}
            <div>
                <p>{{ cat.title }}</p>
                <p>{{ cat.content }}</p>
            </div>
        {% endfor %}
    {% endfor %}
    Je récupère toujours le thème mais pas de catégories.
    Je pense le problème vient de mon champ (clé étrangère) dans l'entité Category. C'est un type Vachard avec un ou plusieurs (ids) puisque une Catégorie peut appartenir à plusieurs Thèmes. Voici un exemple du contenu de ce champ :

    theme_id:


    29,34

    29,31

    29

    21

    29,34

    25,33,34

    Je pense que Doctrine n'arrive pas à faire de comparaison entre les deux champs : theme_id (integer) qui est la clé primaire de la table Theme et Theme(varchard) clé étrangère de la table Category. dans

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Par défaut
    e pense le problème vient de mon champ (clé étrangère) dans l'entité Category. C'est un type Vachard avec un ou plusieurs (ids)
    ou ca un varchar ??


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /**
         * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Theme", inversedBy="categories")
         * @ORM\JoinColumn(name="id", referencedColumnName="id")
         */
        private $theme;

Discussions similaires

  1. help : récupération des données + symfony
    Par mdimagho dans le forum Doctrine2
    Réponses: 0
    Dernier message: 29/05/2013, 12h10
  2. Réponses: 2
    Dernier message: 20/02/2004, 08h47
  3. [ DB2] => [ORACLE] Récupération de données
    Par LeDid dans le forum DB2
    Réponses: 3
    Dernier message: 25/06/2003, 17h10
  4. Réponses: 13
    Dernier message: 20/03/2003, 08h11
  5. [XMLRAD] récupération de donnée
    Par Mitch79 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 30/01/2003, 15h36

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