MySQL Joomla 数据库 - 如何在 getQuery 中使用 LIMIT?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12768647/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 15:06:56  来源:igfitidea点击:

Joomla Database - How to use LIMIT in getQuery?

mysqljoomlajoomla2.5joomla3.0joomla3.1

提问by Techie

I want to build the below query using joomla inbuilt database class.

我想使用 joomla 内置数据库类构建以下查询。

SELECT * 
FROM table_name
ORDER BY id DESC
LIMIT 1

This is the query I have built up to now.

这是我到现在为止建立的查询。

$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();

I don't know how to add the limit(LIMIT 1) to the query. Can someone please tell me how to do it? Thanks

我不知道如何将限制(LIMIT 1)添加到查询中。有人可以告诉我怎么做吗?谢谢

回答by Techie

Older than Joomla 3.0

早于 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();

$db->setQueryfunction takes 3 parameters. The first one being the query, then the start, then the limit. We can limit records as shown above.

$db->setQuery函数需要3个参数。第一个是查询,然后是开始,然后是限制。我们可以限制记录,如上所示。

Newer than Joomla 3.0

比 Joomla 3.0 更新

setLimit(integer $limit, integer $offset)

If you want just one row

如果你只想要一排

$query->setLimit(1);

Read more

阅读更多

回答by John Linhart

This should work as well:

这也应该有效:

$query->setLimit(1);

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

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

回答by Dennis Heiden

SetLimit doesn't work for me in Joomla 3.4.x, so try:

SetLimit 在 Joomla 3.4.x 中对我不起作用,所以尝试:

Within the model:

模型内:

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;
}

Davids answer: https://joomla.stackexchange.com/questions/4249/model-getlistquery-fetch-all-rows-with-using-jpagination

大卫回答:https: //joomla.stackexchange.com/questions/4249/model-getlistquery-fetch-all-rows-with-using-jpagination

Run that before the model calls getItems and it will load all the items for you.

A few caveats with this.

You can also do this outside the model, so if for instance you were in your view. You could do the following:

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

Sometimes you can do this too early, before the model's state has been populated, which will cause the model to get rebuilt from the user state after you have set the limit, basically overriding the limit.

To fix this, you can force the model to populate its state first:

$model = $this->getModel(); $model->getState(); $model->setState('list.limit', 0); The actual populateState method is protected, so outside the model you can't call it directly, but any call to getState will make sure that the populateState is called before returning the current settings in the state.

在模型调用 getItems 之前运行它,它将为您加载所有项目。

一些警告。

您也可以在模型之外执行此操作,例如,如果您在您的视图中。您可以执行以下操作:

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

有时您可以在填充模型状态之前过早地执行此操作,这将导致模型在设置限制后从用户状态重建,基本上是覆盖限制。

要解决此问题,您可以强制模型首先填充其状态:

$model = $this->getModel(); $model->getState(); $model->setState('list.limit', 0); 实际的 populateState 方法是受保护的,因此在模型之外您不能直接调用它,但是对 getState 的任何调用都将确保在返回状态中的当前设置之前调用 populateState。

回答by Mohd Abdul Mujib

Update:Just had to revisit this answer, and I can confirm, both the methods setLimit& orderare working if used as below.

更新:只是不得不重新审视这个答案,我可以证实,这两种方法 setLimitorder如果用作如下工作。

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


OLD ANSWER

旧答案

As of 08/Sept/14 The solutions from @Dasun or @escopecz arent working for me on J3.x

截至 14 年 9 月 8 日,@Dasun 或 @escopecz 的解决方案在 J3.x 上对我不起作用

but this old trick is working for me which is nice,

但是这个老技巧对我有用,这很好,

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

And About your specific requirement of wishing to fetch only 1 rowyou could use :

关于您希望仅获取 1 行的具体要求,您可以使用:

  $rows = $db->loadObject();