如何从CakePHP 3结果对象中获取第一项

时间:2015-04-13 16:34:05

标签: php object cakephp resultset cakephp-3.0

TLDR:如何使用结果对象中的第一项?


从数据库中获取数据后,我想先取出第一个数据并单独使用它,然后重复其余的视频。 (全部在我的模板/视图文件中)。如果它是一个数组,我可以使用像array_shift这样的东西,但到目前为止,这个对象,我来了空。

首先,我在Controller中获取数据,然后将其传递给View:

$videos = $this->Videos->find();
$this->set(compact('videos'));

然后,在视图(模板文件)中,我试过这个:

$featuredVideo = $videos{0};
  

错误无法使用Cake \ ORM \ Query类型的对象作为数组

而且:

$featuredVideo = $videos->0;
  

错误:语法错误,意外' 0' (T_LNUMBER),期待标识符(T_STRING)或变量(T_VARIABLE)或' {'或者' $'

而且:

$featuredVideo = $videos->toArray()[0];

这可以(有点),但是我必须使用$featuredVideo作为数组,这与其他地方不同,并且看起来不优雅。

而且:

$featuredVideo = $videos->first();

这太棒了,但是它将整个对象限制为只有第一个,所以我不再拥有其余的视频。

而且:

$allVideos = $videos;
$featuredVideo = $videos->first();

但是,显然因为它是一个对象,$allVideos只是对$videos的引用,因为它们都缩小为第一个视频。

我意识到这似乎是一个简单的问题,而且它可能是一个简单的答案,但我已经环顾四周,并尝试了如何从具有上述结果的对象中获取第一个项目的建议。

1 个答案:

答案 0 :(得分:8)

我无法理解的是->find()只返回查询对象,直到您通过->all()->first()或通过{{1}运行它来告诉它}循环。

所以,我不能只访问第一个子对象,因为查询尚未执行以显示结果。

当我在设置上面的变量后尝试foreach()时,它实际上是在将limit设置为1后对查询对象执行查询,因此两者都只有1。

更多details here

答案(代码中):

->first()

此处有关when query objects are lazily evaluated的详细信息。


感谢jose_zap和marc_帮助我澄清这一点。