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

ORM PHP Discussion :

Knp_paginator symfony 4 jointure queryBuilder


Sujet :

ORM PHP

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Knp_paginator symfony 4 jointure queryBuilder
    Bonjour

    Voici mon problème:

    Je voudrais faire une pagination de la liste de parkings dans une ville.

    L'entity 'city' est liée à l'entity 'park' avec une relation OneToMany bidirectionnelle. J'ai donc fait une jointure dans le queryBuilder, j'utilise le bundle Knp_paginator. Mais voilà la pagination ne s'affiche pas

    Après plusieurs jours à chercher, je ne vois pas où est le problème. Pourriez-vous me donner une piste? Je vous en remercie d'avance

    Voici mes codes:

    Dans le CityRepository.php, j'ai le queryBuilder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function getCityWithParks() {
            return $this->createQueryBuilder('c')
                ->join('c.parks', 'p')
                ->getQuery()
                ->getResult();
        }
    Dans le CityController, la pagination:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $parks = $paginator->paginate(
               $this->repository->getCityWithParks(),
               $request->query->getInt('page', 1),
               5
           );
    Et dans la vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    {% for park in city.parks %}
                           <tr>
                               <td><a href="{{ path('admin.showPark', { slug: city.slug, id: park.id}) }}" class="address">{{ park.address }}</a></td>
                               <td>{{ park.postalCode }}</td>
                               <td>{{ park.description }}</td>
                           </tr>
                       {% endfor %}
                   </tbody>
                   <div class="pagination">
                       {{ knp_pagination_render(parks) }}
                   </div>

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    bonjour,
    est-ce que ta requête fonctionne sans knp_paginator ?que retourne $this->repository->getCityWithParks()?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dump( $this->repository->getCityWithParks() );

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Déjà merci pour ta réponse!
    J'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function getCityWithParks() {
            return $this->createQueryBuilder('c')
                ->join('c.parks', 'p')
                ->getQuery()
                ->getResult();
                dd( $this->repository->getCityWithParks() );
        }
    Je n'obtiens rien
    Avec la pagination, j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    AdminController.php on line 91:
    array:3 [0 => City {#860 ▶}
      1 => City {#964 ▶}
      2 => City {#968 ▶}
    ]
    Toutes les city sont listées alors que je ne veux que la city avec id=1

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    le débogage avec dd() au dans le contrôleur montre que ta requête retourne bien des villes.

    Toutes les city sont listées alors que je ne veux que la city avec id=1
    si tu veux récupérer que les parks de la ville dont l'id est 1 il faudra le préciser dans la requête à l'aide de la clause where:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /**
    *  Liste tous les parkings d'une ville
    * $param $id id de la ville
    */
    public function getCityWithParks( int $id ) : iterable {
            return $this->createQueryBuilder('c')
                ->join('c.parks', 'p')
                ->where('c.id = :id')
                ->setParameter('id', $id );
                ->getQuery()
                ->getResult();
        }
    dans le controlleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $parks = $paginator->paginate(
               $this->repository->getCityWithParks( 1),  // tu pourras changer  1 par $request->get('id') par eexemple
               $request->query->getInt('page', 1),
               5
           );
    dd( $parks); // les données se trouvent dans l'élément items qu'il faut dérouler
    que renvoie dd() ?

    https://github.com/KnpLabs/KnpPaginatorBundle

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Je n'ai rien avec dans le controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $parks = $paginator->paginate(
                $this->repository->getCityWithParks($request->get('id')),
                $request->query->getInt('page', 1),
                5
            );
            dd($parks);
    et dans le repository
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function getCityWithParks( int $id ) : iterable {
            return $this->createQueryBuilder('c')
                ->join('c.parks', 'p')
                ->where('c.id = :id')
                ->setParameter('id',$id )
                ->getQuery()
                ->getResult();
        }
    J'ai bien la liste des parks mais pas la pagination

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    si rien ne s'affiche dans le contrôleur c'est probablement que l'objet $paginator n'est jamais injecté en paramètre de l'action ou du constructeur du contrôleur.
    Tu peux poster le code de l'action associée à ton contrôleur en intégralité ou tout le tout le code du contrôleur.

    Concernant ta vue twig, il faut juste parcourir le tableau city et non city.parks:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {% for item in city %}
       {{ item.park.postalCode }}
    {% endfor %}
    au passage tu n'a vraiment pas besoin de ce bundle pour faire une simple pagination, tu peux créer ta propre pagination.

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse et désolée du temps pour y répondre.
    Je n'ai pas tout compris..... Mais effectivement, je peux faire la pagination avec Doctrine.
    Je vais m'y pencher demain en espérant y parvenir!

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/09/2017, 09h57
  2. [1.x] jointure sous symfony
    Par goood dans le forum Symfony
    Réponses: 11
    Dernier message: 17/09/2011, 12h57
  3. QueryBuilder et jointure automatique
    Par Manuk dans le forum Doctrine2
    Réponses: 3
    Dernier message: 16/08/2011, 19h34
  4. [1.x] récupérer les données d'une jointure: symfony
    Par marwina32 dans le forum Symfony
    Réponses: 35
    Dernier message: 10/09/2010, 12h35
  5. [1.x] jointure entre tables de bd différentes symfony
    Par jemele dans le forum Symfony
    Réponses: 2
    Dernier message: 07/07/2008, 10h03

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