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',
    ),
 ));

不符合我的意愿。此外,如果我不评论第一行("字段"),它只返回一个结果。BTW,$param2是用户的输入


编辑编辑:脏的解决方案

我用了纳赛尔的方法。我不完全理解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')函数并更改您需要的内容。我会给你代码的链接,尽管我没有你确切的cakepp版本,所以你应该仔细检查
据我所知,该函数唯一的问题是它只返回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
                                    )
                                );