Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-10-2008 16:24:17

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Pb d'utilisation de Zend_Paginator avec requete union

hello,

j'ai un soucis avec l'utilisation de Zend_Paginator sur un Requete d'union.

voila ma requete d'union:

Code:

$maTable1 = new MaTable();
$select = $maTable1->select()....
$maTable2 = new MaTable();
$select2 = $maTable2->select()....
...
$maTable3 = new MaTable();
$finalSelect = $maTable3->_db->select()->union( array( $select,  $select2) );
....

Jusque la pas de soucis la requete $finalSelect marche très bien dans un fetchAll, En revanche pour l'utilisation du paginator c'est autre chose:

Code:

$paginator = Zend_Paginator::factory($finalSelect ); //me génère une erreur

//Et voila l'erreur retourné:
//No table has been specified for the FROM clause

Sauf que la clause from est spécifié au niveau des selects mais pas sur l'objet finalSelect. Et si je rajoute le from il me génère logiquement une erreur: Invalid use of table with UNION

une idée comment résoudre ce pb ?

précision: si à la place de $finalSelect j'utilise $select ou $select2 il fonctionne à merveille

Dernière modification par bucheron (28-10-2008 16:24:51)

Hors ligne

 

#2 29-10-2008 08:40:30

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

Bonjour bucheron,

Dans une premier temps il faudrait connaître quel est le type de donnée retournée par $maTable3->_db->select()->union( array( $select,  $select2) ). Car d'après les erreurs que tu as, lorsque tu utilise :

Code:

$paginator = Zend_Paginator::factory($finalSelect );

$finalSelect est une instance de Zend_Db_Select (à vérifier) avec l'élément de requête "FROM" qui te manque. La solution serait de transformer ton résultat en tableau.

a++

Hors ligne

 

#3 29-10-2008 09:24:27

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb d'utilisation de Zend_Paginator avec requete union

en effet c'est bien une instance de Zend_db_Select. Il serait facile de le transformer en tableau et apres de le charger dans le paginator sauf que cette solution oblige de charger TOUTES les données. Ce qui entraine une grosse perte de performance.

Hors ligne

 

#4 29-10-2008 10:15:43

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

ok j'ai trouvé. J'ai fait le même processus que tu cite plus haut.

Cependant la formulation de l'union est incorrecte car elle me génère une erreur (visible quand j'ai commenté le paginator) :

Code:

Warning: Invalid use of table with UNION in C:\wamp\www\clients\XxX\library\Zend\Db\Select.php on line 1222

donc j'ai regardé comment formuler la requête pour faire une union, c'est :

Code:

$finalSelect = $this->_db->select()
            ->union(array($select, $select2));

Il ne faut pas écrire $maTable3 = new MaTable();
$finalSelect = $maTable3-> ...

Du coup la requête SQL est juste et le paginator fonctionne.
wink

Fini de jouer, le travail m'attend wink
a+ Roulio

Hors ligne

 

#5 29-10-2008 10:54:11

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb d'utilisation de Zend_Paginator avec requete union

euhhh,

merci pour ton aide roulio, mais la formulation de l'union ne change rien chez moi. Je précise qu'en executant la requete dans un fetchAll aucun pb.
Le pb reste le meme chez moi avec ta déclaration ou avec la mienne. tj la même erreur:
No table has been specified for the FROM clause

Si cela fonctionne chez toi, est ce que tu pourrais me donner le code de la classe que tu utilises ? (même si c'est spécifique à ton application, j'arriverais à décortiquer le code).

Hors ligne

 

#6 29-10-2008 11:39:42

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

Autant pour moi je crois mettre emballé trop vite.

effectivement, j'ai un problème avec l'union également. En écrivant la requête directement :

Code:

$maTable3 = new Postes();
$select3 = $maTable3->select("SELECT * FROM postes WHERE `agence_id`=30 UNION SELECT * FROM postes WHERE `poste_secteur`=0");
echo $select3;

// Retourne 
SELECT `postes`.* FROM `postes`

Hors ligne

 

#7 29-10-2008 11:42:28

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

Pour revenir au test d'avant je faisais :

Code:

$maTable1 = new Postes();
$select = $maTable1->select("SELECT * FROM postes WHERE `agence_id`=30");
$maTable2 = new Postes();
$select2 = $maTable2->select("SELECT * FROM postes WHERE `poste_secteur`=0");

$finalSelect = $this->_db->select()->union(array( $select,  $select2) );
echo $finalSelect;

ce qui me renvoit :
SELECT `postes`.* FROM `postes` UNION SELECT `postes`.* FROM `postes`

Donc les résultats ne sont pas bons car il a carrément enlever "WHERE `agence_id`=30" et "WHERE `poste_secteur`=0"...

Dernière modification par Roulio (29-10-2008 11:43:19)

Hors ligne

 

#8 29-10-2008 11:49:23

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

Cette fois ci j'ai fais :

Code:

 
$select5 = $this->_db->select()
    ->from('postes', '*')
    ->where('postes.agence_id = ?', 30); 
    
$select6 = $this->_db->select()
    ->from('postes', '*')
    ->where('postes.poste_secteur = ?', 0); 

$finalSelect2     = $this->_db->select()
    ->union(array($select5, $select6)); 

echo $finalSelect2;

Ce qui me donne le résultat attendu, à savoir : SELECT `postes`.* FROM `postes` WHERE (postes.agence_id = 30) UNION SELECT `postes`.* FROM `postes` WHERE (postes.poste_secteur = 0)

MAIS

j'ai toujours l'erreur :

No table has been specified for the FROM clause

Dernière modification par Roulio (29-10-2008 11:50:41)

Hors ligne

 

#9 29-10-2008 11:57:00

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb d'utilisation de Zend_Paginator avec requete union

yes la on en est au même point.

J'ai l'impression que c'est un bug avec le composant lui même.
En gros qu'ils n'ont pas pris en compte le cas de l'union.
Qu'est ce que t en pense ?

Hors ligne

 

#10 29-10-2008 12:04:44

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

vu les différents tests, tu dois avoir raison. Tu sais comment le notifier ? car perso je ne sais pas comment ça se passe, si il faut un compte,etc.

Hors ligne

 

#11 29-10-2008 12:32:31

etaty
Membre
Date d'inscription: 16-10-2008
Messages: 49

Re: Pb d'utilisation de Zend_Paginator avec requete union

tu as essayé de mettre des :
->setIntegrityCheck(false)

voir : http://framework.zend.com/manual/fr/zend.db.table.html exemple 11.100

Hors ligne

 

#12 29-10-2008 13:08:34

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb d'utilisation de Zend_Paginator avec requete union

@etaty: ça ne change rien

@Roulio: j'ai encore jamais notifier de pb, je vais me renseigner

Hors ligne

 

#13 29-10-2008 13:18:16

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

Hello,

J'ai seulement ceci :

Code:

// $db = un Zend_Db_Adapter
$select5 = $db->select()
    ->from('postes', '*')
    ->where('postes.agence_id = ?', 30); 
    
$select6 = $db->select()
    ->from('postes', '*')
    ->where('postes.poste_secteur = ?', 0); 

$finalSelect2     = $db->select()
    ->union(array($select5, $select6)); 

$paginator = Zend_Paginator::factory($finalSelect2 );

Ceci s'exécute sans erreur chez moi (1.7.0PR), ai-je tout le code nécessaire pour générer votre erreur ?

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#14 29-10-2008 13:53:12

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

J'ai rajouté dans le controller :

Code:

$this->view->layout()->paginator = Zend_Paginator::factory($finalSelect2);

et dans la vue

Code:

echo $this->paginationControl($this->layout()->paginator, 'Sliding', 'pagination_numbered.phtml');

Hors ligne

 

#15 29-10-2008 13:55:12

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

Hello,

J'ai trouvé. Ce n'est pas un bug de Zend_Paginator.

La clause UNION a été introduite pour des requêtes simples, pour l'instant l'union ne peut pas être utilisé de cette façon. On peut simplement faire l'UNION de 2 SELECT pas plus.

Zend_Paginator ajoute une clause limit à l'objet select qu'il reçoit et c'est là que cela bloque.

A+

Dernière modification par mikaelkael (29-10-2008 14:19:58)


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#16 29-10-2008 14:11:02

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb d'utilisation de Zend_Paginator avec requete union

@roulio si l'erreur ne se génère pas lors de l'appel à zend_paginator, elle ne se produira pas plus tard

@mikaelkael je capte pas pourquoi tu n'arrive pas à générer l'erreur, j'ai encore essayé de faire des tests avec une fois un nouvelle adapter et l'autre en appelant la classe elle meme mais l'erreur est toujours la:

Code:

$maTable  = new  new MaTable();
$finalSelect = $maTable->_db->select()->union( array( $select,  $select2) );
ou
$finalSelect = $this->_db->select()->union( array( $select,  $select2) );

Petite précision, mais je ne pense pas que ça change qq chose: $maTable hérite de Zend_Db_Table_Abstract

Hors ligne

 

#17 29-10-2008 14:17:17

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

@bucheron: je répondais à mikaelkael, pour avoir l'erreur avec le "paginationControl". Car s'est bien à ce niveau que l'erreur apparaît (sans en être certain).

Dernière modification par Roulio (29-10-2008 14:18:08)

Hors ligne

 

#18 29-10-2008 14:17:44

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb d'utilisation de Zend_Paginator avec requete union

bucheron a écrit:

@roulio si l'erreur ne se génère pas lors de l'appel à zend_paginator, elle ne se produira pas plus tard

@mikaelkael je capte pas pourquoi tu n'arrive pas à générer l'erreur, j'ai encore essayé de faire des tests avec une fois un nouvelle adapter et l'autre en appelant la classe elle meme mais l'erreur est toujours la:

Code:

$maTable  = new  new MaTable();
$finalSelect = $maTable->_db->select()->union( array( $select,  $select2) );
ou
$finalSelect = $this->_db->select()->union( array( $select,  $select2) );

Petite précision, mais je ne pense pas que ça change qq chose: $maTable hérite de Zend_Db_Table_Abstract

@roulio j'avais pas encore rechargé ma page quand je t ai écris sad

comment on pourrait faire pour contourner ce problème ?

Hors ligne

 

#19 29-10-2008 14:21:30

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

Hello,

J'ai aussi l'erreur mais regardez mon message précédent.

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#20 29-10-2008 14:34:17

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

Pourquoi pas :

Code:

$results = $maTable->getAdapter()->fetchAll($finalSelect);
$this->view->layout()->paginator = Zend_Paginator::factory($results);

?

Dernière modification par Roulio (29-10-2008 14:34:50)

Hors ligne

 

#21 29-10-2008 14:50:52

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

Hello,

Comme le dis dans bucheron dans un post précédent, tu fais venir TOUS les résultats de ta bdd pour n'en afficher qu'un certain nombre. C'est dommage mais dans ton cas, c'est peut-être la seule solution actuellement.

Il faut peut-être aussi posé la question sur les mailing lists.

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#22 29-10-2008 14:54:24

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb d'utilisation de Zend_Paginator avec requete union

@roulio  possible mais comme je t'avais déjà indiqué cela va charger toutes les données donc imagine tant à 10 000. et tu en affiche 20 par page. Il n'y a donc aucun intéret de charger les 10 000 enregistrements.

Peut etre faudrait il créer un nouvel adapter.
Pkoi pas s'inspirer de celui ci:
http://www.noginn.com/2008/08/25/zend_p … _db_table/

Hors ligne

 

#23 29-10-2008 14:59:48

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: Pb d'utilisation de Zend_Paginator avec requete union

ok!!! J'ai compris ! big_smile

Je ne pensais pas que par "perte de performance" comme tu me l'avais déjà dit bucheron ça se manifeste de cette façon. L'utilisation d'une instance de Zend_Db_Select est effectivement meilleure.

Merci à tous les 2 pour cette précision.

Dernière modification par Roulio (29-10-2008 15:08:22)

Hors ligne

 

#24 03-11-2008 15:45:17

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb d'utilisation de Zend_Paginator avec requete union

bon j'ai développé un petit adapter pour zend paginator.

Quand pensez vous ?

voila la classe en question

Code:

class My_Adapter_UnionPaginator implements Zend_Paginator_Adapter_Interface
{
    /**
     * The table to select from
     *
     * @var Zend_Db_Table
     */
    protected $_table;

    /**
     * Constructor.
     *
     * @param Zend_Db_Table_Select $select The select query
     * @param Zend_Db_Table $table The table to select from
     */
    public function __construct(Zend_Db_Select $select, Zend_Db_Table_Abstract $table)
    {
        $this->_select = $select;
        $this->_table = $table;
    }

    /**
     * Returns a rowset object
     *
     * @param  integer $offset Page offset
     * @param  integer $itemCountPerPage Number of items per page
     * @return Zend_Db_Table_Rowset
     */
    public function getItems($offset, $itemCountPerPage)
    {
        $this->_select->limit($itemCountPerPage, $offset);
        $db = $this->_table->getAdapter();
        return $db->fetchAll($this->_select);
    }

    /**
     * Returns the total number of rows in the result set.
     *
     * @return integer
     */
    public function count()
    {
        
        $db = $this->_table->getAdapter();
        
        return count($db->fetchAll($this->_select));
        
    }
}
?>

voila pour l'initialisation:

Code:

        $paginator = new Zend_Paginator(
                new My_Adapter_UnionPaginator($finalSelect, $maTable)
            );
...

ceci fonctionne chez moi, mais peut être on peut l'optimiser. J'attends vos feedbacks

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