symfony 3 api rest

Probleme accéde à un clé etrangers , api rest

Le problème exposé dans ce sujet a été résolu.

Salut,

Voila je rencontre un petit problème avec mon code. j’ai utilisé base de donnée mysql et l’api rest , code_ens c’est une clé étrangers , j’ai besoin d’accéder à cette champs mais mon code est par défaut il accède à le champs id de la table EnseignantHasGrade par defaut , voilà mon code ,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
    /**
     * @Rest\View() 
     * @Rest\Get("/grade_ens/{code_ens}")
     */
    public function getGrEnsAction(Request $request)
    {

        $req= $this->get('doctrine.orm.entity_manager')
                   ->getRepository('AppBundle:EnseignantHasGrade')
                   ->find($request->get('code_ens'));
        /* @var $ens Enseignant */
         if (empty($req)) {
            return new JsonResponse(['message' => 'grade enseignant not found'], Response::HTTP_NOT_FOUND);
        }
        $formatted = [
           'code'=> $req->getCodeGrade(),
        ];

        return new JsonResponse($formatted);
    }

je veux accéder à le champs code_ens pour afficher une donnée "code grade"

voilà la classe Entity EnseignanatHasGrade

  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
127
128
129
130
131
132
133
134
<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * EnseignantHasGrade
 *
 * @ORM\Table(name="enseignant_has_grade", indexes={@ORM\Index(name="IDX_7A743CD96B0F81DC", columns={"code_ens"}), @ORM\Index(name="IDX_7A743CD9B50FB778", columns={"code_grade"})})
 * @ORM\Entity
 */
class EnseignantHasGrade
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="date_obtention", type="string", length=255, nullable=true)
     */
    private $dateObtention;

    /**
     * @var \AppBundle\Entity\Enseignant
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Enseignant")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="code_ens", referencedColumnName="id")
     * })
     */
    private $codeEns;

    /**
     * @var \AppBundle\Entity\Grade
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Grade")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="code_grade", referencedColumnName="id")
     * })
     */
    private $codeGrade;



    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set dateObtention
     *
     * @param string $dateObtention
     *
     * @return EnseignantHasGrade
     */
    public function setDateObtention($dateObtention)
    {
        $this->dateObtention = $dateObtention;

        return $this;
    }

    /**
     * Get dateObtention
     *
     * @return string
     */
    public function getDateObtention()
    {
        return $this->dateObtention;
    }

    /**
     * Set codeEns
     *
     * @param \AppBundle\Entity\Enseignant $codeEns
     *
     * @return EnseignantHasGrade
     */
    public function setCodeEns(\AppBundle\Entity\Enseignant $codeEns = null)
    {
        $this->codeEns = $codeEns;

        return $this;
    }

    /**
     * Get codeEns
     *
     * @return \AppBundle\Entity\Enseignant
     */
    public function getCodeEns()
    {
        return $this->codeEns;
    }

    /**
     * Set codeGrade
     *
     * @param \AppBundle\Entity\Grade $codeGrade
     *
     * @return EnseignantHasGrade
     */
    public function setCodeGrade(\AppBundle\Entity\Grade $codeGrade = null)
    {
        $this->codeGrade = $codeGrade;

        return $this;
    }

    /**
     * Get codeGrade
     *
     * @return \AppBundle\Entity\Grade
     */
    public function getCodeGrade()
    {
        return $this->codeGrade;
    }
}

Merci de m’aider ..

+0 -0

`il affiche grade enseignant not found malgré que le cin est existe dans la base de donnée

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/**
     * @Rest\View() 
     * @Rest\Get("/grade_ens/{cin}")
     */

    public function getGrEnsAction(Request $request, $cin)
    {

      $em = $this->getDoctrine();
           $req = $em->getRepository('AppBundle:EnseignantHasGrade')
                     ->findByCodeEns($request->get($cin));

     if (empty($req)) {
            return new JsonResponse(['message' => 'grade enseignant not found'], Response::HTTP_NOT_FOUND);
      }
        $formatted = [
           'code'=> $req->getCodeGrade(),
        ];

        return new JsonResponse($formatted);
    }
+0 -0

Si tu changes le code en cours de route ça ne peut pas aller…

Tu as ici $request->get($cin) alors qu’avant tu m’as mis $request->get('code_ens')

C’est quoi ce $cin qui est dans l’URL ? c’est le code_ens ?

Parce que là ce que veux dire ton code ($request->get($cin)) c’est que si $cin vaut blah alors il va chercher dans la requête un champ blah. Donc dans ton cas ça voudrait dire que tu veux aboutir à : /grade_ens/blah?blah=123 => ça n’a pas de sens.

De ce que je comprends, la façon propre de faire ce serait :

 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
<?php
/**
 * @Rest\View()
 * @Rest\Get("/grade_ens/{codeEns}")
 */

public function getGrEnsAction($codeEns)
{
  $em = $this->getDoctrine();

  $enseignant = $em->getRepository('AppBundle:EnseignantHasGrade')->findOneBy([
    'codeEns' => $codeEns
  ]);

  if (!$enseignant) {
    return new JsonResponse(
      [
        'message' => 'grade enseignant not found'
      ],
      Response::HTTP_NOT_FOUND
    );
  }

  return new JsonResponse([
    'code'=> $enseignant->getCodeGrade(),
  ]);
}

merci pour votre aide $cin c’est le donnée qui va chercher , http://localhost/ws_rest/web/app_dev.php/grade_ens/00015308 00015308 c’est le cin et le colonne qui contient les cins c’est "code_ens" , le résultat de votre proposition en format json

1
2
3
4
5
6
7
{
  "code": {
    "__initializer__": {},
    "__cloner__": {},
    "__isInitialized__": false
  }
}
+0 -0

Salut !

J’avoue avoir aussi un peu de peine à m’y retrouver…
Mais de ce que j’ai cru comprendre, la version proposée par Alex-D devrait fonctionner. Sauf que cette propriété codeEns est de type Enseignant, et non un entier ou une chaîne de caractères. Il faut fournir un objet Enseignant à findOneBy(array('codeEns' => /* ici */) — ou à findOneByCodeEns(/* ici */), d’ailleurs.

Tu pourrais utiliser un ParamConverter qui prendrait l’attribut de la route pour le transformer en un objet Enseignant, passé comme paramètre $codeEns de l’action getGrEnsAction — pour autant que ce soit possible avec les routes définies par @Rest, je n’avais pas fait attention à ce détail. Ça donnerait quelque chose comme cela :

1
2
3
4
5
6
7
8
<?php
/**
 * @Rest\View()
 * @Rest\Get("/grade_ens/{codeEns}")
 *
 * @ParamConverter("codeEns", class="AppBundle:Enseignant", options={"codeEns" = "codeEns"})
 */
public function getGrEnsAction(\AppBundle\Entity\Enseignant $codeEns)
La signature de la méthode avec les annotations, le reste devrait fonctionner tel que proposé auparavant

Si je peux me permettre, évite de nommer les propriétés d’un objet comme si c’était une seule propriété d’un autre alors que tu as l’objet entier. Ici, tu as une propriété EnsegnanatHasGrade#codeEns qui ne contient pas le code de l’enseignant, mais un objet Enseignant complet, et je pense que c’est quelque chose qui va te freiner encore un moment.

+0 -0

Bonjour,

Alex_D t’a proposé des solutions. Si elles ne fonctionnent pas, je t’encourage à tenter de décrire le plus clairement possible ce qui ne marche pas, ainsi que ce que tu souhaites faire (et non pas seulement comment tu essaies de le faire).

+1 -0

Bonjour, Bon j’ai trouvé la solution, qui consiste à Considérer l’attribut codeGrade comme un objet de type Grade et nous devons y accéder à l’aide des getters de la classe Grade.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* @Rest\View() 
* @Rest\Get("/grade/{cin}")
*/

public function getGradeAction(Request $request)
{
        $req= $this->get('doctrine.orm.entity_manager')
                ->getRepository('AppBundle:EnseignantHasGrade')
                ->findOneBy($arrayName = array('codeEns' => $request->get('cin') ));

        if (empty($req)) {
            return new JsonResponse(['message' => 'grade not found'], Response::HTTP_NOT_FOUND);
        }

        $formatted = [
           'codeGrade'=>$req->getCodeGrade()->getId(),
           'titreGrade'=>$req->getCodeGrade()->getTitre(),

        ];


        return new JsonResponse($formatted);
}
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte