繁体   English   中英

CakePHP:查找记录并检索以下10条记录

[英]CakePHP: Find a record and retrieve the 10 following records

我开发了一个工具,您可以根据表格中的输入从一个大表中获取10条记录。 例如,如果表中有一个记录为“数字”的列,则您可以输入一个数字,应用程序将把带有该数字的10条以下记录返回到该记录。

这样做的目的是从最后一次获取中始终获取最近的10次输入。

问题是AFAIK无法在特定位置开始搜索的情况下进行查找。

查找邻居非常接近,但不幸的是,它仅返回两个结果:搜索的前一个和下一个。

有任何想法吗?


编辑:现在查询看起来像这样:

 $data = $this->Tweet->find('all', array(
   'field' => array('Tweet.permalink' => $param2),
   'fields' => array('Tweet.embed'),
   'limit' => 10,
   'order' => array('Tweet.created' => 'desc'),
   'contain' => false,
   // 'offset' => 1,
   'conditions' => array('not' => array('Tweet.embed' => null),
    'Tweet.status' => 'approved',
    ),
 ));

不按我想要的方式工作。 另外,如果我不注释第一行(“字段”),它只会返回一个结果。 顺便说一句,$ param2是用户的输入


编辑编辑: 肮脏的解决方案

我使用了Nunser方法。 我不完全了解findNeighbors函数,但是在进行一些调试之后,该函数最终如下所示:

protected function _findNeighbors($state, $query, $results = array()) {
    extract($query);

    if ($state === 'before') {
        $conditions = (array)$conditions;
        if (isset($field) && isset($value)) {
            if (strpos($field, '.') === false) {
                $field = $this->alias . '.' . $field;
            }
        } else {
            $field = $this->alias . '.' . $this->primaryKey;
            $value = $this->id;
        }

        $query['conditions'] = array_merge($conditions, array($field . ' <' => $value));
        $query['order'] = $field . ' DESC';
        $query['limit'] = 10;
        $query['field'] = $field;
        $query['value'] = $value;

        return $query;
    }



    return $results;
}

参见$ query ['limit'] = 10; 领域? 最初它仅限于一个结果,因此我添加了0并切碎了以下代码,从而构建了prev和next数组。 我不知道它如何获得10个结果,如何构建SQL查询,但是它有效!

它有一个错误:如果您进行查询,并且搜索的项目前没有10个结果,它将返回随机结果。

一定是因为已经晚了,但我真的不明白您要做什么。

但是无论如何,由于您说find('neighbors')是“相当接近”的,我将为您提供一个定制更改的选项,以适应您的需求。 话虽这么说,如果别人比我少睡眠不足,并为您提供了更有效的解决方案,那就接受它。

无论如何,解决方案:建立自定义查找。
Cake的文档介绍了如何创建一个 这样做,就是find('lots-of-neighbors')查找。 创建一个新的自定义查找似乎很简单,因此在这里不做解释,如果您不了解那里的内容,应该提出一个新问题。

现在,要在自定义查找功能中实际放置什么? 好吧,复制find('neighbors')函数并更改所需的内容。 我将为您提供代码链接 ,尽管我没有确切的cakephp版本,所以您应仔细检查。
从我的理解,你有该功能的唯一的问题是,它只是恢复2条,所以你可能不得不只改变limits条件内(线3143,3156,3160)。

简而言之就是这样。 如果不是您想要的东西,我明天早上再给它。

它不是一种方便的方法,但可能对您有用-

$find_id = $this->Tweet->find('first', array(
                                        'conditions' => array(
                                                'Tweet.permalink' => $param2
                                            )
                                        )
                                    );

现在我有了该记录的ID ...因此ID为auto_increment,现在我可以使用>=<=

$tweets = $this->Tweet->find('all', array(
                                        'conditions' => array(
                                            'Tweet.id >=' =>$find_id['Tweet']['id'] 
                                        ),
                                        'limit' => 10
                                    )
                                );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM