Magento, errore conteggio records su SELECT con GROUP BY

Effettuando una qualsiasi SELECT e raggruppandola con la dichiarazione GROUP BY, il conteggio dei records non riporta il numero esatto di risultati ottenuti.

Il problema

Ne consegue che tutte le operazioni collegate al conteggio dei record, come ad esempio la paginazione, non operano correttamente.

La causa

La colpa di tutto questo sta in un metodo della classe “Varien_Data_Collection_Db“. Questa classe fa parte delle librerie di Magento, quindi troviamo il file al percorso standard “/lib/Varien/Data/Collection/Db.php“.

Il metodo da correggere è “getSelectCountSql()“. Questo metodo prende la SELECT che si sta eseguendo, e apportando una semplice modifica, ne restituisce un’altra che restituisce il numero di records selezionati.

Tuttavia, come dicevo prima, se si usa la dichiarazione GROUP BY, la query restituita non conteggia più correttamente.

La soluzione

Sfruttando il sistema standard di overriding di Magento, puoi correggere senza particolari difficoltà il bug. Non devi fare altro che creare la stessa struttura di cartelle, in “/app/code/local/“. In pratica devi avere il seguente percorso “/app/code/local/Varien/Data/Collection/Db.php“.

Copia il file originale “Db.php“, deve avere esattamente lo stesso contenuto. Poi, individua il metodo “getSelectCountSql()” e sostituiscilo con quanto segue:

Non c’è altro da fare, quindi salva il file ed eventualmente caricalo sul tuo server.

Come funziona

Semplicemente verifico se la SELECT contiene una dichiarazione GROUP BY. Se si, la elimino dalla query e modifico il conteggio aggiungendo una DISTINCT per tutti i campi del raggruppamento. Tutto questo è molto semplicemente l’IF ed il suo contenuto.

Add a Comment