Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Dans le cadre de mon stage, je créé une API REST sur Symfony 4.4.

J'ai donc d'un côte: l'API que je réalise qui va devoir héberger tous les algos de calcul de prix, de taux d'occupation de chambres,...
De l'autre, j'ai le serveur-client qui va puiser en JSON mes données (partie que je reprends d'un autre stagiaire).

Je me perds un peu dans la logique des API, des endpoints...

Ici, j'aimerais calculer le nombre de chambres totales par type de chambre (simple, double, familiale) et envoyer un seul endpoint qui regrouperait les 3 calculs de chambres par type de chambre.

Je fais cela dans mon controller "HotelController":

    /**
     * @Route("/hotels/{id}", name="hotels_id", methods={"GET"})
     */

    public function sumAllRoomsOfHotel($id, HotelRepository $hotelRepo)
    {
//        $em = $this->manager();
        $q = Doctrine_Query::create()
        ->SELECT('COUNT(DISTINCT ro.id) AS room_total')
        ->FROM ('room AS ro')
        ->InnerJoin('withdraw AS w ON w.room_id = ro.id')
        ->InnerJoin('room_type AS rt ON ro.room_type_id = rt.id')
        ->InnerJoin('hotel AS h ON rt.hotel_id = h.id')
        ->InnerJoin('room_category AS rc ON rt.room_category_id = rc.id')
        ->WHERE('rc.id = rt.room_category_id')
        ->AND('h.id=$id"');
//                 echo '<pre>'; var_dump($rawSql); echo '</pre>';
        $hotels = $q->fetchArray();
        echo $hotels;

Ce que je veux

En faisant en RAWSQL et un var_dump de ma requête, je vois bien que ma requête sort ("SELECT ... FROM... WHERE h.id=3"), je voudrais sortir les 3 résultats : un pour les simple, un pour les double et un pour les familiales

Ce que j'obtiens

Depuis que je viens de basculer en DQL, j'ai ce message d'erreur:
"Attempted to load class "Doctrine_Query" from namespace "App\Controller".
Did you forget a "use" statement for another namespace?"

J'ai dû m'embrouiller dans la logique des API car je ne pensais pas faire 3 fonctions distinctes (1 par type de chambre) et surtout si c'est pour les afficher dans un seul endpoint.

Est ce que pour vous je partais sur la bonne piste ou alors ma logique était fausse?
Merci d'avance

2 réponses


Tu as oublié d'importer Doctrine_Query dans ton fichier. Il doit te manquer un "use" au début de ton controller

Knuckles
Auteur

Merci Kareylo, j'ai finalement fait la query sous une autre forme:

/public function sumRoomOfHotel($id, EntityManagerInterface $manager, SerializerInterface $serializer){
$type1 = $manager->createQuery("SELECT COUNT(rt) FROM App\Entity\RoomType rt WHERE rt.code LIKE 'C21%'")->getSingleScalarResult();
}

C'est passé mais je m'étais perdu entre controller et repository.
Le repo aurait du faire les requêtes avec le createQueryBuilder mais celles ci ne fonctionnaient pas.
Finalement, je me suis encore plus perdu que je ne pensais :X car en fait, je devais déjà récupérer les données de type de chambre via le json que m'envoyait le serveur du stagiaire, lui m$eme API (que j'appellerai serveur 1) et faire mes autres calculs de prix dans mon API (serveur 2).

Du coup, j'en suis là, essayer de récupérer ses datas et j'ai testé comme cela mais sans succès:
J'ai un message d'erreur m'indiquant un "failed to open stream" des datas du serveur 1 dans mon serveur 2.
J'ai lancé mes 2 serveurs et ai bien lancé le serveur 1 en 2nd pour qu'il ait le port 8001.

    public function actu_deben(SerializerInterface $serializer, HotelRepository $hotelRepo)
    {
        $roomTypePerHotel = file_get_contents('http://localhost:8001/hotels/1/roomtypes');
//     $roomTypePerHotel = file_get_contents('https://oc-jswebsrv.herokuapp.com/api/articles');
        $roomTypePerHotel=$serializer->decode('$roomTypePerHotel', 'json');
       dump($roomTypePerHotel);
        die();

/*        return $this->render(
            'api_calcul_tarif/index.html.twig',
            ['hotels' => $hotels]
        );*/

Je deviens fou sur cette histoire de API sur la même machine. Je pense devoir refaire un tour sur les basiques de Symfony là :)

Si vous avez une idée pour m'éviter Sainte-Anne, je suis preneur :)