it-swarm-eu.dev

Trasformazione di una query per JDATABASE

Ho bisogno di trasformare una semplice query php in una query che JDATABASE capirà.

Ecco l'esempio:

$resDays        = 7;                // On how many days to build the top?
$resLimit       = 20;               // How many results to display?

$query = "SELECT `artist`, title, count(*) AS tracks FROM `history
          WHERE TIMESTAMPDIFF(DAY, `date_played`, NOW()) <= " . $resDays . "
          AND `song_type`=0 GROUP BY title ORDER BY tracks DESC LIMIT 0," . $resLimit;

E questo è quello che sono riuscito a fare:

// Create a new query object.
$query = $db->getQuery(true);
$query->select($db->quoteName(array('artist', 'title')));
$query->from($db->quoteName('history'));

$db->setQuery($query);
$query->setLimit(20);
$result = $db->loadObjectList();

Il problema è che non so come includere nella mia query le parti mancanti come ORDER tracks O count(*) AS tracks.

1
Victor
$query = $db->getQuery(true);
$query->select($db->quoteName(array('artist', 'title')));
$query->select('COUNT(*) AS tracks');
$query->from($db->quoteName('history'));
$query->where('TIMESTAMPDIFF(DAY, date_played, NOW()) <= ' . $db->quote($resDays));
$query->where('song_type = 0');
$query->group('title');
$query->order('tracks DESC');

// Set the query + limit
$db->setQuery($query, 0, $resLimit);

Puoi testare come appare la tua query con $ query-> dump ();

API: https://api.joomla.org/cms-3/classes/JDatabaseQuery.html

2
fruppel

Il GROUP BY Può essere ottenuto usando ->group(...) e il ORDER BY Può essere ottenuto usando ->order(...).

Quindi la tua query completa sarebbe simile a questa:

$query = $db->getQuery(true)
      ->select(
          array(
            $db->quoteName('artist'),
            $db->quoteName('title'),
            'COUNT(*) AS ' . $db->quoteName('tracks')
          )
      )
      ->from($db->quoteName('history'))
      ->where('TIMESTAMPDIFF(DAY, ' . $db->quoteName('date_played') . ', NOW()) <= ' . $db->quote($resDays))
      ->where($db->quoteName('song_type') . ' = 0')
      ->group($db->quoteName('title'))
      ->order($db->quoteName('tracks') . ' DESC')
      ->setLimit(20);

$db->setQuery($query);

$result = $db->loadObjectList();

Non sono del 100% sicuro della clausola where che ho scritto per te. Fai un test e fammi sapere se funziona.

1
Lodder