【问题标题】:Joomla Database - How to use LIMIT in getQuery?Joomla 数据库 - 如何在 getQuery 中使用 LIMIT?
【发布时间】:2012-09-27 22:21:48
【问题描述】:

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

SELECT * 
FROM table_name
ORDER BY id DESC
LIMIT 1

这是我目前建立的查询。

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

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

【问题讨论】:

    标签: mysql joomla joomla2.5 joomla3.0 joomla3.1


    【解决方案1】:

    更新:只需要重新访问这个答案,我可以确认,这两种方法 setLimitorder 正在工作,如果使用如下。

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

    老答案

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

    但是这个老把戏对我有用,这很好,

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

    关于您希望fetch only 1 row 的具体要求,您可以使用:

      $rows = $db->loadObject();
    

    【讨论】:

    • @mickmackusa 我绝对同意应该遵循正确的用法,只是在那个时候(大约 5 年前),我无法使用有问题的方法并且是非常沮丧,在终于找到解决方法后,我只是在这里发布了它,希望它可以帮助遇到类似情况的人。
    【解决方案2】:

    SetLimit 在 Joomla 3.4.x 中对我不起作用,因此请尝试:

    模型内:

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

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

    在模型调用 getItems 之前运行它,它将加载所有 给你的东西。

    对此有一些注意事项。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      早于 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->setQuery 函数有 3 个参数。第一个是查询,然后是开始,然后是限制。我们可以如上所示限制记录。

      比 Joomla 3.0 更新

      setLimit(integer $limit, integer $offset)
      

      如果你只想要一行

      $query->setLimit(1);
      

      Read more

      【讨论】:

      • 这很奇怪(我会尝试找出原因)旧方法适用于 J3.3.1,但新方法不适用。
      • Krzysztof Jarosz - 我也遇到了同样的问题,即 setLimit() 不适用于 Joomla 3.3.2。
      【解决方案4】:

      这应该也可以:

      $query->setLimit(1);
      

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

      【讨论】:

      • 自 Joomla 3.0(平台 12.1)起
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 2014-10-29
      • 2013-05-22
      • 2013-04-06
      • 1970-01-01
      • 2014-11-03
      相关资源
      最近更新 更多