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



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


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

首先,我在控制器中获取数据,并将其传递给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的引用,因为它们都被简化为第一个视频。

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

我不明白的是,->find()只是返回查询对象,直到您告诉它通过->all()->first()执行,或者通过foreach()循环运行它。

因此,我不能只访问第一个子对象,因为查询还没有执行以显示结果。

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

更多详细信息请点击此处。

答案(代码):

// Controller
$videos = $this->Videos->find()->all();
$this->set(compact('videos'));
// View
$featuredVideo = $videos->first();

此处提供了有关延迟求值查询对象的更多详细信息。


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

相关内容

  • 没有找到相关文章

最新更新