web-dev-qa-db-fra.com

Base de données Joomla - Comment utiliser LIMIT dans getQuery?

Je veux construire la requête ci-dessous en utilisant la classe de base de données intégrée joomla.

SELECT * 
FROM table_name
ORDER BY id DESC
LIMIT 1

C'est la requête que j'ai construite jusqu'à présent.

$db =& JFactory::getDBO();       
$query  = $db->getQuery(true);
$query->select($db->nameQuote('*'));
$query->from($db->nameQuote(TABLE_PREFIX.'table_name'));      
$db->setQuery($query);      
$rows = $db->loadObjectList();

Je ne sais pas comment ajouter la limite (LIMIT 1) à la requête. Quelqu'un peut-il me dire comment procéder? Merci

20
Techie

Plus ancien que Joomla 3.0

$db = JFactory::getDBO();    

$query  = $db->getQuery(true);
$query->select('*')
 ->from($db->nameQuote('#__table_name'))
 ->order($db->nameQuote('id').' desc');     
$db->setQuery($query,0,1);  

$rows = $db->loadObjectList();

La fonction $db->setQuery Prend 3 paramètres. Le premier étant la requête, puis le début, puis la limite. Nous pouvons limiter les enregistrements comme indiqué ci-dessus.

Plus récent que Joomla 3.0

setLimit(integer $limit, integer $offset)

Si vous voulez une seule ligne

$query->setLimit(1);

En savoir plus

44
Techie

Cela devrait également fonctionner:

$query->setLimit(1);

Documentation: http://api.joomla.org/cms-3/classes/JDatabaseQueryLimitable.html

4
John Linhart

SetLimit ne fonctionne pas pour moi dans Joomla 3.4.x, alors essayez:

Dans le modèle:

protected function getListQuery()
{
    // Create a new query object.
    $db = JFactory::getDBO();
    $query = $db->getQuery(true);

    // Select some fields
    $query->select('*');
    $query->from('#__your_table');

    $this->setState('list.limit', 0); // 0 = unlimited

    return $query;
}

Réponse de David: https://joomla.stackexchange.com/questions/4249/model-getlistquery-fetch-all-rows-with-using-jpagination

Exécutez cela avant que le modèle appelle getItems et il chargera tous les éléments pour vous.

Quelques mises en garde à ce sujet.

Vous pouvez également le faire en dehors du modèle, donc si, par exemple, vous étiez dans votre vue. Vous pouvez effectuer les opérations suivantes:

$ model = $ this-> getModel (); $ model-> setState ('list.limit', 0);

Parfois, vous pouvez le faire trop tôt, avant que l'état du modèle ne soit rempli, ce qui entraînera la reconstruction du modèle à partir de l'état utilisateur après avoir défini la limite, remplaçant essentiellement la limite.

Pour résoudre ce problème, vous pouvez forcer le modèle à remplir d'abord son état:

$ model = $ this-> getModel (); $ model-> getState (); $ model-> setState ('list.limit', 0); La méthode populateState réelle est protégée, donc en dehors du modèle, vous ne pouvez pas l'appeler directement, mais tout appel à getState s'assurera que le populateState est appelé avant de renvoyer les paramètres actuels dans l'état.

3
Dennis Heiden

Mise à jour: Je viens de revoir cette réponse, et je peux confirmer, les deux méthodes setLimit & order fonctionnent si utilisé comme ci-dessous.

$query->order($db->qn($data->sort_column_name) . ' ' . $data->sort_column_order);
$query->setLimit($length,$start);

ANCIENNE RÉPONSE

Au 08/Sept/14 Les solutions de @Dasun ou @escopecz ne fonctionnent pas pour moi sur J3.x

mais cette vieille astuce fonctionne pour moi qui est Nice,

  $query->order($db->qn('id') . ' DESC LIMIT 25');

Et à propos de votre exigence spécifique de vouloir récupérer seulement 1 ligne vous pouvez utiliser:

  $rows = $db->loadObject();
2
Mohd Abdul Mujib