Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 13-10-2014 16:05:13

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Doctrine pagination sur une requête avec des leftJoin

Bonjour,

J'ai un soucis avec doctrine, j’aimerai mettre une pagination sur des commandes (avec des entités articles et adresses) et des jointures.
Le soucis, c'est que j'ai une erreur de type :

Code:

Cannot count query which selects two FROM components, cannot make distinction

Lorsque je récupère mes résultats, j'ai vérifié sur le net et je pense donc que doctrine à du mal a savoir sur quoi il doit paginer... y a t'il une méthode ou un truc que j'ai oublié de faire pour lui dire cela justement ?

voici le code de ma requête :

Code:

[lang=php]
$repository = $this->em->createQueryBuilder();
        $repository
            ->select(array('p','pa','pi'))
            ->from('Invoice\Entity\Orders', 'p')
            ->leftJoin('Invoice\Entity\adress', 'pa', 'WITH', 'p.idOrder = pa.idOrder')
            ->leftJoin('Invoice\Entity\item', 'pi', 'WITH', 'p.idOrder = pi.idOrder')
            ->where('p.idOrder= :idOrder')
            ->setParameter('idOrder', $idOrder);
$adapter = new DoctrineAdapter(new ORMPaginator($repository));

Mon adapter est récupéré dans le controller, ou j'y fait un new Paginator.

Code:

[lang=php]
$paginator = new Paginator($order);
        $paginator->setCurrentPageNumber($page);
        $paginator->setDefaultItemCountPerPage(50);

Jusque là j'ai essayé de lui passer à la place un array

Code:

[lang=php]
$paginator = new Paginator(new ArrayAdapter($order));
        $paginator->setCurrentPageNumber($page);
        $paginator->setDefaultItemCountPerPage(50);

Mais je n'arrive pas à exploiter le résultat obtenu dans une boucle puisque j'ai tout au même niveau.. comment faire ?

Si vous avez besoin de renseignements complémentaires, n'hésitez pas.

Si possible avant d'exploiter la méthode par arrayAdapter j'aimerai voir s'il est pas possible de trouver une solution avec la première méthode, que je trouve bien plus pratique.
Merci par avance de votre aide.

Dernière modification par JGreco (13-10-2014 16:06:54)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#2 13-10-2014 17:34:18

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine pagination sur une requête avec des leftJoin

Salut voici un exemple de comment utiliser le paginator :

Code:

[lang=php]
<?php

namespace Application\Repository;

use Doctrine\ORM\EntityRepository;
use DoctrineORMModule\Paginator\Adapter\DoctrinePaginator as PaginatorAdapter;
use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
use Zend\Paginator\Paginator;

class PhotoRepository extends EntityRepository
{

    const APPLICATION_ENTITY = 'Application\Entity\\';

    public function findWaitingPhotosByUser(Membre $user)
    {
        $qb = $this->getEntityManager()->createQueryBuilder();
        $qb->select('p')
            ->from(self::APPLICATION_ENTITY . 'Photo', 'p')
            ->where('p.valid = :valid')
            ->andWhere('p.author = :author')
            ->orderBy('p.dateCreate', 'DESC');

        $query = $qb->getQuery()->setParameters(
            array(
                'valid' => false,
                'author' => $user,
            )
        );
        $doctrineAdapter = new PaginatorAdapter(new DoctrinePaginator($query, false));

        return new Paginator($doctrineAdapter);
    }

Hors ligne

 

#3 13-10-2014 17:55:32

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Doctrine pagination sur une requête avec des leftJoin

Salut Orkin

Merci de ta réponse,

J'ai bien lu ton code, mais il ne me donne aucune infos en plus par rapport à mon soucis. J'ai déjà réussi a faire marcher une pagination, dans mon module album j'en avait fait une et ça marchait niquel sauf que je n'avait pas besoin d'en construire une via une requête utilisant des Join.

La en gros ce que je veux faire c'est afficher toutes mes commandes et pour chacunes afficher les articles et adresses. Et vu que j'en ai pas mal mettre une pagination par 50 commandes.
Du coup j'arrive a récupérer toutes mes infos, mais paginator me renvoi un array de taille 4000 au lieu de 6XX. J'ai tous mes résultats au même niveau alors que j'aurais voulu un array (collection) comme cela :

- Orders 1 (Entity/Orders)
- - Adress (Entity\Address)
- - Item (Entity\Item)

- Orders 2 (Entity/Orders)
- - Adress (Entity\Address)
- - Item (Entity\Item)

- Orders 3 (Entity/Orders)
- - Adress (Entity\Address)
- - Item (Entity\Item)

Et donc en faisant un foreach sur mes Orders j'avais tout ce qu'il fallait. Mes entités Address et Item on une clé étrangère sur Orders et c'est tout. Dois-je rajouter des choses ? Genre des méthodes d'accès a mes items / addresses dans mon entité Orders ?
Dois-je aborder le problème sous un autre angle ?

Merci de ton aide en tous cas, si tu as une idée n'hésites pas merci smile

Dernière modification par JGreco (13-10-2014 18:02:22)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#4 14-10-2014 10:11:20

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine pagination sur une requête avec des leftJoin

Dans ton select retire le array et sépare simplement par des virgules. Genre select('a, b, c') ou select ('a', 'b', 'c'). Je vois pas en quoi un leftJoin ferait planter le paginateur. Essai de rajouter un order by.

Hors ligne

 

#5 14-10-2014 10:18:17

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Doctrine pagination sur une requête avec des leftJoin

Merci de ta réponse, toujours rien j'ai ceci actuellement :

Code:

[lang=php]
$repository = $this->em->createQueryBuilder();
        $repository
            ->select('p, pa, pi')
            ->add('from',
                'Invoice\Entity\Orders p
                LEFT JOIN Invoice\Entity\Address pa WITH p.idOrder = pa.idOrder
                LEFT JOIN Invoice\Entity\Item pi WITH p.idOrder = pi.idOrder'
            )
            ->andWhere('p.idProformat = :idproformat')
            ->setParameter('idproformat', $proformatID);
        $adapter = new DoctrineAdapter(new ORMPaginator($repository, $fetchJoinCollection = true));
        return $adapter;

Toujours le meme message d'erreur :

Code:

Runtime exception
File:
C:\wamp\www\project\vendor\doctrine\orm\lib\Doctrine\ORM\Tools\Pagination\WhereInWalker.php:85
Message:
Cannot count query which selects two FROM components, cannot make distinction

stack trace :
...

Comme tu peux le voir j'ai essayé de faire un add au lieu d'un from et des left join car je croyais que ça pouvait venir de là, mais pas de succès non plus...


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#6 14-10-2014 18:01:14

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine pagination sur une requête avec des leftJoin

Non ça fait la même chose. Hmm à part faire select('p') pour avoir qu'un seul objet je vois pas ...

Hors ligne

 

#7 16-10-2014 11:14:17

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Doctrine pagination sur une requête avec des leftJoin

Problème résolu, franchement c'était tout con, mais vu que j'apprend encore plein de chose, je savais pas...

En gros dans une relation ManytoOne, je ne savais pas qu'il fallait faire une relation bidirectionnelle
http://docs.doctrine-project.org/projec … irectional
C'est sur qu'avec cela ça marche beaucoup mieux pour ma requête en query builder j'ai même plus besoin de faire de jointure j'ai tout récup d'un coup..

Résolu, merci pour ton temps Orkin.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages