【问题标题】:How do I get a random row in CakePHP 3.0?如何在 CakePHP 3.0 中获得随机行?
【发布时间】:2015-02-05 15:52:01
【问题描述】:

我正在尝试使用 CakePHP 3.0 RC-1 检索随机行,我查看了 the docs

使用我从 CakePHP 2.X 获得的东西,并将其作为在 CakePHP 3.0 RC-1 中获取随机行的起点。然而,这显然不是为蛋糕小姐做的:

$result = $this->Game->find('all')
            ->order('rand()')
            ->limit(1);

结果一无所获。数据库中有数据,我可以检索单个记录。 (即 $this->Game->get(20) 正常工作)。

【问题讨论】:

  • 对我来说工作得很好...您究竟是如何测试结果的(仅调试 $result 不会执行查询)? ps,也尝试使用最近的开发快照。
  • 只是 var_dump 在视图或控制器中的整个 $game 实体。这是最新的开发快照。
  • 你有它,你正在做的是转储查询,而不是结果。您必须首先实际获取一些东西,例如使用first()(然后您可以放弃limit())。见book.cakephp.org/3.0/en/orm/query-builder.html#the-query-object
  • 那么,如果我通过 ->GET 而不是通过上述代码 var_dump 一个结果集,为什么我会看到结果?
  • 因为Table::get() 在内部调用Query::firstOrFail()(它再次调用Query::first())。我建议检查源代码(让您单击方法调用的适当 IDE 会有所帮助)。

标签: php cakephp cakephp-3.0


【解决方案1】:

只需使用“first”即可获得第一个结果:

$result = $this->Game->find('all')
        ->order('rand()')
        ->first();

或者,你可以让它像get()一样工作,如果没有找到结果,它会返回一个异常:

$result = $this->Game->find('all')
        ->order('rand()')
        ->firstOrFail();

【讨论】:

  • 这行得通,但是由于您没有限制,它的效率如何? (发现所有听起来好像你正在获得一个大结果集,然后从中获得第一个)
  • 使用RAND() 总是很糟糕,因为它需要获取所有结果,随机排序,然后对结果进行切片。关于您的问题,firstOrFail 将为您申请 LIMIT 1。不过,这并不意味着RAND() 的执行速度会更快。
  • 当然,但是你可以再次触发查询缓存,限制影响。
猜你喜欢
  • 2015-01-14
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2019-07-12
相关资源
最近更新 更多