如何在CakePHP3.0中获得随机行?

如何在CakePHP3.0中获得随机行?,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我正在尝试用CakePHP3.0RC-1检索一个随机行,我已经研究过了 使用cakephp2.X中的内容,并将其作为在cakephp3.0rc-1中获取随机行的起点。然而,这显然不是为了蛋糕小姐: $result = $this->Game->find('all') ->order('rand()') ->limit(1); 结果一无所获。数据库中有数据,我可以检索单个记录。(即$this->Game->get(20)的工

我正在尝试用CakePHP3.0RC-1检索一个随机行,我已经研究过了

使用cakephp2.X中的内容,并将其作为在cakephp3.0rc-1中获取随机行的起点。然而,这显然不是为了蛋糕小姐:

$result = $this->Game->find('all')
            ->order('rand()')
            ->limit(1);
结果一无所获。数据库中有数据,我可以检索单个记录。(即$this->Game->get(20)的工作原理与它应该的一样)。

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

$result = $this->Game->find('all')
        ->order('rand()')
        ->first();
或者,您可以让它像
get()
一样工作,因为如果找不到结果,它将返回异常:

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

对我来说很好。。。您如何准确地测试结果(仅调试
$result
不会执行查询)?另外,还可以尝试使用最新的开发快照。只需在视图中或控制器中转储整个$game实体即可。这是最新的开发人员快照。您可以看到它,您正在做的是转储查询,而不是结果。您必须首先实际获取某些内容,例如使用
first()
(您可以放弃
limit()
)。请参见,如果我通过->GET而不是通过上述代码转储resultset,为什么会看到结果?因为
Table::GET()
在内部调用
Query::firstOrFail()
(再次调用
Query::first()
)。我建议检查源代码(一个合适的IDE,让你点击方法调用会有帮助)。这是可行的,但既然你没有限制,它的效率有多高?(查找所有听起来像是在获取一个大的结果集,然后从中获取第一个结果集)使用
RAND()
总是很糟糕,因为它需要获取所有结果,随机排序,然后对结果进行切片。关于您的问题,
first或fail
将为您应用
限制1
。但是,这并不意味着
RAND()
的执行速度会更快。当然,但是您可以再次触发查询缓存,从而限制影响。