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

时间:2014-04-22 18:25:04

标签: php cakephp find

我开发了一个工具,你可以根据表单中的输入从大表中获取10条记录。例如,如果表格中有一个带有记录"数字"的列,您可以输入一个数字,然后应用程序会将10个以下记录返回到该记录中。 / p>

这样做的目的是始终获得最后一次获取中最新的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是用户的输入


修改编辑: 脏解决方案

我使用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 [&#39; limit&#39;] = 10;领域?最初它只限于一个结果,所以我添加了一个0并切断了以下代码,它构建了prev和next数组。我不知道它是如何获得10个结果的,SQL查询是如何构建的,但是它有效!

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

2 个答案:

答案 0 :(得分:3)

一定是因为已经很晚了,但我并没有真正理解你想要做什么。

但无论如何,既然你说find('neighbors')已经非常接近,那么我会给你一个自定义更改的选项,以满足你的需求。话虽这么说,如果其他人的睡眠不如我,并为你提供更有效的解决方案,那就接受吧。

无论如何,解决方案:构建自定义查找 Cake的文档解释了how to create one。这样做,find('lots-of-neighbors')找到。 创建一个新的自定义查找似乎非常简单,所以不解释,如果你不了解那里的话,你应该问一个新的问题。

现在,实际放入自定义查找功能的内容是什么?好吧,复制find('neighbors')功能并更改您需要的功能。我会给你link for the code,虽然我没有你的确切cakephp版本,所以你应该仔细检查。
根据我的理解,你对该功能的唯一问题是它只返回2条记录,因此你可能只需要改变条件内的limits(第3143,3156,3160行)。

简而言之。如果它不是你想要的,我明天早上再给它一次。

答案 1 :(得分:2)

它不是一种方便的方法,但可能适合你 -

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