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

4

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


从数据库获取数据后,我想先将第一个数据分离出来并单独使用,再遍历剩余视频。(都在我的模板/视图文件中)。如果它是数组,我可以使用 array_shift 这样的方法,但到目前为止,使用对象时我什么也没得到。

首先,在我的控制器中获取数据,并将其传递给视图:

$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个回答

11
我没有理解的是->find()仅返回查询对象,直到您通过->all()->first()或通过foreach()循环执行它。

因此,我无法访问第一个子对象,因为查询尚未执行以显示结果。

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

更多详细信息请参见此处

答案(用代码表示):

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

// View
$featuredVideo = $videos->first();

有关于查询对象何时惰性评估的更多详细信息,请参考此处。


感谢jose_zap和marc_为我澄清这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接