web-dev-qa-db-fra.com

Comment écrire une requête avec GROUP BY et ORDER BY en utilisant les méthodes de requête de Joomla?

J'ai la requête suivante que j'ai besoin de convertir en Joomla en utilisant JDatabase. Cette requête s'exécute comme prévu dans phpMyAdmin.

SELECT `id`, DATE_FORMAT(`estEventDate`, '%b %Y') AS estDate, COUNT(`id`) AS cnt FROM `jdev_events` GROUP BY estDate ORDER BY estDate DESC

J'ai essayé de nombreuses manières différentes, mais sans succès. Le premier problème que j'ai rencontré était que je ne peux pas alias la fonction mais seulement le champ dans le $db->quoteName().

$query->selcet(array($db->quoteName('id'), 'DATE_FORMAT(' . $db->quoteName('estEventDate') . ', "%b %Y")' . ' AS estDate', 'COUNT(' . $db->quoteName('id') . ') as cnt'));

Mais même si je supprime les pseudonymes ...

$query->selcet(array($db->quoteName('id'), 'DATE_FORMAT(' . $db->quoteName('estEventDate') . ', "%b %Y")', 'COUNT(' . $db->quoteName('id') . ')'));

ça ne marche pas.

Ensuite, j'ai essayé de définir l'objet SELECT en tant que chaîne:

$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select("`id`, DATE_FORMAT(`estEventDate`, '%b %Y') AS estDate, COUNT(`id`) AS cnt");
$query->from($db->quoteName('#__events'));
$query->group('estDate');
$query->order('estDate DESC');
$db->setQuery($query);
JLog::add('Query : ' . $query->__toString(), JLog::DEBUG, 'custom.field.estDate.getOptions');
$estDates = $db->loadObjectLsit();
JLog::add('EstDates' . print_r($estDates, 1), JLog::DEBUG, 'custom.field.estDate.getOptions');

Voici les entrées du journal:

2018-11-06T00:37:36+00:00       DEBUG 127.0.0.1 custom.field.estdate.getOptions    Query : 
SELECT `id`, DATE_FORMAT(`estEventDate`, '%b %Y') AS estDate, COUNT(`id`) AS cnt
FROM `#__events`
GROUP BY estDate
ORDER BY estDate DESC
2018-11-06T00:37:36+00:00       DEBUG 127.0.0.1 custom.field.estdate.getOptions    EstDates :

Je n'ai plus d'idées.

3
mixahlos

Je vois des erreurs de frappe mineures dans chacune de vos tentatives de codage (noms de méthodes mal orthographiées: selcet et loadObjectLsit).

Écrivez l'ordre GROUP BY comme suit: ( lien de référence )

SELECT id, DATE_FORMAT(estEventDate, '%b %Y') AS estDate, COUNT(id) AS cnt
FROM #__events
GROUP BY estDate DESC

Implémentez comme suit: (aucun appel de devis n'est nécessaire pour votre requête)

$db = JFactory::getDbo();
try {
    $query = $db->getQuery(true)
        ->select("id, DATE_FORMAT(estEventDate, '%b %Y') AS estDate, COUNT(id) AS cnt")
        ->from("#__events")
        ->group("estDate DESC");
    echo $query->dump();
    $db->setQuery($query);
    $resultset = $db->loadObjectList();
    if (!$resultset) {
        echo "No Rows In Resultset";
    } else {
        foreach ($resultset as $row) {
            echo "<div>";
                echo "<div>ID: {$row->id}</div>";
                echo "<div>EstDate: {$row->estDate}</div>";
                echo "<div>Count: {$row->cnt}</div>";
            echo "</div>";
        }
    }
} catch (Exception $e) {
    JFactory::getApplication()->enqueueMessage("Query Syntax Error: " . $e->getMessage(), 'error');    // never show to public

}
4
mickmackusa