【问题标题】:CakePHP: Find a record and retrieve the 10 following recordsCakePHP:查找记录并检索以下 10 条记录
【发布时间】:2014-04-22 18:25:04
【问题描述】:

我开发了一个工具,您可以根据表单中的输入从一个大表中获取 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 个结果,它将返回随机结果。

【问题讨论】:

  • 添加您的查询。可能有错字(如条件而不是条件)
  • 'not' =&gt; array('Tweet.embed' =&gt; null)你可以改成'Tweet.embed !=' =&gt; null

标签: php cakephp find


【解决方案1】:

一定是因为太晚了,但我真的不明白你想做什么。

但无论如何,既然你说find('neighbors')“非常接近”,我会给你一个选项来自定义更改以满足你的需要。话虽如此,如果其他人的睡眠剥夺比我少,并为您提供更有效的解决方案,请接受。

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

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

简而言之就是这样。如果不是你想要的,我明天早上再试一次。

【讨论】:

  • 这比我想象的要复杂一些(我可能因为弄乱了他们自己的蛋糕核心而冒犯了一些 Cakephp 开发人员)但我终于成功地调整了 findneighbors 函数。谢谢!
  • @Andres 很高兴你成功了,但是忠告:如果你弄乱了核心,Cakephp 开发人员可能会很卑鄙!嗯......不是真的,但如果你冒险进入 lib/cake 去做你的事,升级 cake 版本将会很痛苦(相信我......)。如果我不能说服您为您想要的内容进行自定义查找,我可以说服您将您刚刚在核心中修改的 protected function _findNeighbors 复制到 AppModel(在您的应用程序文件夹中)并将 Model.php 中的那个保留为它是?这样不那么乱。由于 AppModel 继承自 Model(所说的 find 所在的位置),因此您应该不会有任何问题。
  • 确实如此,幸运的是,这是一个将在几周内结束的项目,所以没问题。如果其他人遇到同样的问题,我也会用解决方案编辑我的问题。谢谢!
【解决方案2】:

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

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

现在我有了该记录的 id...因此 id 是 auto_increment,现在我可以使用 &gt;=&lt;=

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

【讨论】:

  • 这是我最初的方法,但我想知道是否有一种我忽略的自动化方法。
  • 那么你别无选择,只能让海关找到 Nunser 已经建议你的东西......另一种选择是使用 $this->Tweet->query(); 的直接 sql 查询;
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
相关资源
最近更新 更多