[英]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.